poi-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From j...@apache.org
Subject svn commit: r683871 [2/3] - in /poi/trunk/src: java/org/apache/poi/hssf/model/ java/org/apache/poi/hssf/record/ java/org/apache/poi/hssf/record/aggregates/ java/org/apache/poi/hssf/usermodel/ testcases/org/apache/poi/hssf/usermodel/
Date Fri, 08 Aug 2008 06:27:06 GMT
Copied: poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/PageSettingsBlock.java (from r683788, poi/trunk/src/java/org/apache/poi/hssf/model/Sheet.java)
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/PageSettingsBlock.java?p2=poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/PageSettingsBlock.java&p1=poi/trunk/src/java/org/apache/poi/hssf/model/Sheet.java&r1=683788&r2=683871&rev=683871&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/Sheet.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/PageSettingsBlock.java Thu Aug  7 23:27:06 2008
@@ -15,2018 +15,392 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.hssf.model;
+package org.apache.poi.hssf.record.aggregates;
 
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.poi.hssf.record.BOFRecord;
+import org.apache.poi.hssf.model.RecordStream;
+import org.apache.poi.hssf.model.Sheet;
 import org.apache.poi.hssf.record.BottomMarginRecord;
-import org.apache.poi.hssf.record.CFHeaderRecord;
-import org.apache.poi.hssf.record.CalcCountRecord;
-import org.apache.poi.hssf.record.CalcModeRecord;
-import org.apache.poi.hssf.record.CellValueRecordInterface;
-import org.apache.poi.hssf.record.ColumnInfoRecord;
-import org.apache.poi.hssf.record.DBCellRecord;
-import org.apache.poi.hssf.record.DVALRecord;
-import org.apache.poi.hssf.record.DefaultColWidthRecord;
-import org.apache.poi.hssf.record.DefaultRowHeightRecord;
-import org.apache.poi.hssf.record.DeltaRecord;
-import org.apache.poi.hssf.record.DimensionsRecord;
-import org.apache.poi.hssf.record.DrawingRecord;
-import org.apache.poi.hssf.record.EOFRecord;
-import org.apache.poi.hssf.record.EscherAggregate;
 import org.apache.poi.hssf.record.FooterRecord;
-import org.apache.poi.hssf.record.GridsetRecord;
-import org.apache.poi.hssf.record.GutsRecord;
 import org.apache.poi.hssf.record.HCenterRecord;
 import org.apache.poi.hssf.record.HeaderRecord;
 import org.apache.poi.hssf.record.HorizontalPageBreakRecord;
-import org.apache.poi.hssf.record.IndexRecord;
-import org.apache.poi.hssf.record.IterationRecord;
 import org.apache.poi.hssf.record.LeftMarginRecord;
 import org.apache.poi.hssf.record.Margin;
-import org.apache.poi.hssf.record.MergeCellsRecord;
-import org.apache.poi.hssf.record.ObjRecord;
-import org.apache.poi.hssf.record.ObjectProtectRecord;
 import org.apache.poi.hssf.record.PageBreakRecord;
-import org.apache.poi.hssf.record.PaneRecord;
-import org.apache.poi.hssf.record.PasswordRecord;
-import org.apache.poi.hssf.record.PrintGridlinesRecord;
-import org.apache.poi.hssf.record.PrintHeadersRecord;
 import org.apache.poi.hssf.record.PrintSetupRecord;
-import org.apache.poi.hssf.record.ProtectRecord;
 import org.apache.poi.hssf.record.Record;
-import org.apache.poi.hssf.record.RecordBase;
-import org.apache.poi.hssf.record.RefModeRecord;
 import org.apache.poi.hssf.record.RightMarginRecord;
-import org.apache.poi.hssf.record.RowRecord;
-import org.apache.poi.hssf.record.SCLRecord;
-import org.apache.poi.hssf.record.SaveRecalcRecord;
-import org.apache.poi.hssf.record.ScenarioProtectRecord;
-import org.apache.poi.hssf.record.SelectionRecord;
-import org.apache.poi.hssf.record.StringRecord;
 import org.apache.poi.hssf.record.TopMarginRecord;
-import org.apache.poi.hssf.record.UncalcedRecord;
 import org.apache.poi.hssf.record.VCenterRecord;
 import org.apache.poi.hssf.record.VerticalPageBreakRecord;
-import org.apache.poi.hssf.record.WSBoolRecord;
-import org.apache.poi.hssf.record.WindowTwoRecord;
-import org.apache.poi.hssf.record.aggregates.CFRecordsAggregate;
-import org.apache.poi.hssf.record.aggregates.ColumnInfoRecordsAggregate;
-import org.apache.poi.hssf.record.aggregates.ConditionalFormattingTable;
-import org.apache.poi.hssf.record.aggregates.DataValidityTable;
-import org.apache.poi.hssf.record.aggregates.MergedCellsTable;
-import org.apache.poi.hssf.record.aggregates.RecordAggregate;
-import org.apache.poi.hssf.record.aggregates.RowRecordsAggregate;
-import org.apache.poi.hssf.record.aggregates.RecordAggregate.RecordVisitor;
-import org.apache.poi.hssf.util.CellRangeAddress;
-import org.apache.poi.hssf.util.PaneInformation;
-import org.apache.poi.util.POILogFactory;
-import org.apache.poi.util.POILogger;
 
 /**
- * Low level model implementation of a Sheet (one workbook contains many sheets)
- * This file contains the low level binary records starting at the sheets BOF and
- * ending with the sheets EOF.  Use HSSFSheet for a high level representation.
- * <P>
- * The structures of the highlevel API use references to this to perform most of their
- * operations.  Its probably unwise to use these low level structures directly unless you
- * really know what you're doing.  I recommend you read the Microsoft Excel 97 Developer's
- * Kit (Microsoft Press) and the documentation at http://sc.openoffice.org/excelfileformat.pdf
- * before even attempting to use this.
- * <P>
- * @author  Andrew C. Oliver (acoliver at apache dot org)
- * @author  Glen Stampoultzis (glens at apache.org)
- * @author  Shawn Laubach (slaubach at apache dot org) Gridlines, Headers, Footers, PrintSetup, and Setting Default Column Styles
- * @author Jason Height (jheight at chariot dot net dot au) Clone support. DBCell & Index Record writing support
- * @author  Brian Sanders (kestrel at burdell dot org) Active Cell support
- * @author  Jean-Pierre Paris (jean-pierre.paris at m4x dot org) (Just a little)
- *
- * @see org.apache.poi.hssf.model.Workbook
- * @see org.apache.poi.hssf.usermodel.HSSFSheet
- * @version 1.0-pre
+ * Groups the page settings records for a worksheet.<p/>
+ * 
+ * See OOO excelfileformat.pdf sec 4.4 'Page Settings Block'
+ * 
+ * @author Josh Micich
  */
-public final class Sheet implements Model {
-    public static final short   LeftMargin = 0;
-    public static final short   RightMargin = 1;
-    public static final short   TopMargin = 2;
-    public static final short   BottomMargin = 3;
-
-    private static POILogger            log              = POILogFactory.getLogger(Sheet.class);
-
-    protected ArrayList                  records           =     null;
-              int                        preoffset         =     0;            // offset of the sheet in a new file
-    protected int                        dimsloc           =     -1;  // TODO - is it legal for dims record to be missing?
-    protected DimensionsRecord           dims;
-    protected DefaultColWidthRecord      defaultcolwidth   =     null;
-    protected DefaultRowHeightRecord     defaultrowheight  =     null;
-    protected GridsetRecord              gridset           =     null;
-    private   GutsRecord                 _gutsRecord;
-    protected PrintSetupRecord           printSetup        =     null;
-    protected HeaderRecord               header            =     null;
-    protected FooterRecord               footer            =     null;
-    protected PrintGridlinesRecord       printGridlines    =     null;
-    protected WindowTwoRecord            windowTwo         =     null;
-    protected Margin[]                   margins           =     null;
-    private   MergedCellsTable           _mergedCellsTable;
-    protected SelectionRecord            selection         =     null;
-    /** always present in this POI object, not always written to Excel file */
-    /*package*/ColumnInfoRecordsAggregate _columnInfos;
-    protected RowRecordsAggregate        _rowsAggregate              =     null;
-    private   Iterator                   rowRecIterator    =     null;
-    protected int                        eofLoc            =     0;
-    protected ProtectRecord              protect           =     null;
-    protected PageBreakRecord            _rowBreaksRecord;
-    protected PageBreakRecord            _columnBreaksRecord;
-    private   DataValidityTable          _dataValidityTable=     null;
-    protected ObjectProtectRecord        objprotect        =     null;
-    protected ScenarioProtectRecord      scenprotect       =     null;
-    protected PasswordRecord             password          =     null;
-    private   ConditionalFormattingTable condFormatting;
-
-    /** Add an UncalcedRecord if not true indicating formulas have not been calculated */
-    protected boolean _isUncalced = false;
-    
-    public static final byte PANE_LOWER_RIGHT = (byte)0;
-    public static final byte PANE_UPPER_RIGHT = (byte)1;
-    public static final byte PANE_LOWER_LEFT = (byte)2;
-    public static final byte PANE_UPPER_LEFT = (byte)3;
-
-    /**
-     * Creates new Sheet with no initialization --useless at this point
-     * @see #createSheet(List,int,int)
-     */
-    public Sheet()
-    {
-    }
-
-    /**
-     * read support  (offset used as starting point for search) for low level
-     * API.  Pass in an array of Record objects, the sheet number (0 based) and
-     * a record offset (should be the location of the sheets BOF record).  A Sheet
-     * object is constructed and passed back with all of its initialization set
-     * to the passed in records and references to those records held. This function
-     * is normally called via Workbook.
-     *
-     * @param recs array containing those records in the sheet in sequence (normally obtained from RecordFactory)
-     * @param sheetnum integer specifying the sheet's number (0,1 or 2 in this release)
-     * @param offset of the sheet's BOF record
-     *
-     * @return Sheet object with all values set to those read from the file
-     *
-     * @see org.apache.poi.hssf.model.Workbook
-     * @see org.apache.poi.hssf.record.Record
-     */
-    public static Sheet createSheet(List recs, int sheetnum, int offset)
-    {
-        if (log.check( POILogger.DEBUG ))
-            log.logFormatted(POILogger.DEBUG,
-                    "Sheet createSheet (existing file) with %",
-                    new Integer(recs.size()));
-        Sheet     retval             = new Sheet();
-        ArrayList records            = new ArrayList(recs.size() / 5);
-        boolean   isfirstcell        = true;
-        int       bofEofNestingLevel = 0;
-
-        for (int k = offset; k < recs.size(); k++) {
-            Record rec = ( Record ) recs.get(k);
-            if ( rec.getSid() == DBCellRecord.sid ) {
-                continue;
-            }
-            if ( rec.getSid() == IndexRecord.sid ) {
-                // ignore INDEX record because it is only needed by Excel, 
-                // and POI always re-calculates its contents 
-                continue;
-            }
-            if ( rec.getSid() == StringRecord.sid ) {
-                continue;
-            }
-            
-            if ( rec.getSid() == CFHeaderRecord.sid ) {
-                RecordStream rs = new RecordStream(recs, k);
-                retval.condFormatting = new ConditionalFormattingTable(rs);
-                k += rs.getCountRead()-1;
-                records.add(retval.condFormatting);
-                continue;
-            }
-            
-            if (rec.getSid() == ColumnInfoRecord.sid) {
-                RecordStream rs = new RecordStream(recs, k);
-                retval._columnInfos = new ColumnInfoRecordsAggregate(rs);
-                k += rs.getCountRead()-1;
-                records.add(retval._columnInfos);
-                continue;
-            }
-            if ( rec.getSid() == DVALRecord.sid) {
-                RecordStream rs = new RecordStream(recs, k);
-                retval._dataValidityTable = new DataValidityTable(rs);
-                k += rs.getCountRead() - 1; // TODO - convert this method result to be zero based
-                records.add(retval._dataValidityTable);
-                continue;
-            }
-            // TODO construct RowRecordsAggregate from RecordStream
-            if ( rec.getSid() == RowRecord.sid ) {
-                RowRecord row = (RowRecord)rec;
-                if (retval._rowsAggregate == null) {
-                    retval._rowsAggregate = new RowRecordsAggregate();
-                    records.add(retval._rowsAggregate); //only add the aggregate once
-                }
-                retval._rowsAggregate.insertRow(row);
-                continue;
-            }
-            if ( rec.isValue() && bofEofNestingLevel == 1 ) {
-                if (isfirstcell) {
-                    isfirstcell = false;
-                    if (retval._rowsAggregate == null) {
-                        retval._rowsAggregate = new RowRecordsAggregate();
-                        records.add(retval._rowsAggregate); //only add the aggregate once
-                    }
-                    retval._rowsAggregate.constructCellValues( k, recs );
-                }
-               continue;
-            }
-                       
-            
-            if (rec.getSid() == MergeCellsRecord.sid) {
-                RecordStream rs = new RecordStream(recs, k);
-                retval._mergedCellsTable = new MergedCellsTable(rs);
-                records.add(retval._mergedCellsTable);
-                continue; // TODO
-            }
-            
-            if (rec.getSid() == BOFRecord.sid)
-            {
-                bofEofNestingLevel++;
-                if (log.check( POILogger.DEBUG ))
-                    log.log(POILogger.DEBUG, "Hit BOF record. Nesting increased to " + bofEofNestingLevel);
-            }
-            else if (rec.getSid() == EOFRecord.sid)
-            {
-                --bofEofNestingLevel;
-                if (log.check( POILogger.DEBUG ))
-                    log.log(POILogger.DEBUG, "Hit EOF record. Nesting decreased to " + bofEofNestingLevel);
-                if (bofEofNestingLevel == 0) {
-                    records.add(rec);
-                    retval.eofLoc = k;
-                    break;
-                }
-            }
-            else if (rec.getSid() == UncalcedRecord.sid) {
-                retval._isUncalced = true;
-            }
-            else if (rec.getSid() == DimensionsRecord.sid)
-            {
-                // Make a columns aggregate if one hasn't ready been created.
-                if (retval._columnInfos == null)
-                {
-                    retval._columnInfos = new ColumnInfoRecordsAggregate();
-                    records.add(retval._columnInfos);
-                }
-
-                retval.dims    = ( DimensionsRecord ) rec;
-                retval.dimsloc = records.size();
-            }
-            else if (rec.getSid() == DefaultColWidthRecord.sid)
-            {
-                retval.defaultcolwidth = ( DefaultColWidthRecord ) rec;
-            }
-            else if (rec.getSid() == DefaultRowHeightRecord.sid)
-            {
-                retval.defaultrowheight = ( DefaultRowHeightRecord ) rec;
-            }
-            else if ( rec.getSid() == PrintGridlinesRecord.sid )
-            {
-                retval.printGridlines = (PrintGridlinesRecord) rec;
-            }
-            else if ( rec.getSid() == GridsetRecord.sid )
-            {
-                retval.gridset = (GridsetRecord) rec;
-            }
-            else if ( rec.getSid() == HeaderRecord.sid && bofEofNestingLevel == 1)
-            {
-                retval.header = (HeaderRecord) rec;
-            }
-            else if ( rec.getSid() == FooterRecord.sid && bofEofNestingLevel == 1)
-            {
-                retval.footer = (FooterRecord) rec;
-            }
-            else if ( rec.getSid() == PrintSetupRecord.sid && bofEofNestingLevel == 1)
-            {
-                retval.printSetup = (PrintSetupRecord) rec;
-            }
-            else if ( rec.getSid() == LeftMarginRecord.sid)
-            {
-                retval.getMargins()[LeftMargin] = (LeftMarginRecord) rec;
-            }
-            else if ( rec.getSid() == RightMarginRecord.sid)
-            {
-                retval.getMargins()[RightMargin] = (RightMarginRecord) rec;
-            }
-            else if ( rec.getSid() == TopMarginRecord.sid)
-            {
-                retval.getMargins()[TopMargin] = (TopMarginRecord) rec;
-            }
-            else if ( rec.getSid() == BottomMarginRecord.sid)
-            {
-                retval.getMargins()[BottomMargin] = (BottomMarginRecord) rec;
-            }
-            else if ( rec.getSid() == SelectionRecord.sid )
-            {
-                retval.selection = (SelectionRecord) rec;
-            }
-            else if ( rec.getSid() == WindowTwoRecord.sid )
-            {
-                retval.windowTwo = (WindowTwoRecord) rec;
-            }
-            else if ( rec.getSid() == ProtectRecord.sid )
-            {
-                retval.protect = (ProtectRecord) rec;
-            }
-            else if ( rec.getSid() == ObjectProtectRecord.sid )
-            {
-                retval.objprotect = (ObjectProtectRecord) rec;
-            }
-            else if ( rec.getSid() == ScenarioProtectRecord.sid )
-            {
-                retval.scenprotect = (ScenarioProtectRecord) rec;
-            }
-            else if ( rec.getSid() == PasswordRecord.sid )
-            {
-                retval.password = (PasswordRecord) rec;
-            }
-            else if (rec.getSid() == HorizontalPageBreakRecord.sid)
-            {
-                retval._rowBreaksRecord = (HorizontalPageBreakRecord)rec;
-            }
-            else if (rec.getSid() == VerticalPageBreakRecord.sid)
-            {
-                retval._columnBreaksRecord = (VerticalPageBreakRecord)rec;
-            }
-
-            records.add(rec);
-        }
-        if (retval.dimsloc < 0) {
-            throw new RuntimeException("DimensionsRecord was not found");
-        }
-        retval.records = records;
-        retval.checkRows();
-        if (log.check( POILogger.DEBUG ))
-            log.log(POILogger.DEBUG, "sheet createSheet (existing file) exited");
-        return retval;
-    }
-
-    private static final class RecordCloner implements RecordVisitor {
-
-        private final List _destList;
-
-        public RecordCloner(List destList) {
-            _destList = destList;
-        }
-        public void visitRecord(Record r) {
-            _destList.add(r.clone());
-        }
-    }
-
-    /**
-     * Clones the low level records of this sheet and returns the new sheet instance.
-     * This method is implemented by adding methods for deep cloning to all records that
-     * can be added to a sheet. The <b>Record</b> object does not implement cloneable.
-     * When adding a new record, implement a public clone method if and only if the record
-     * belongs to a sheet.
-     */
-    public Sheet cloneSheet() {
-        ArrayList clonedRecords = new ArrayList(this.records.size());
-        for (int i = 0; i < this.records.size(); i++) {
-            RecordBase rb = (RecordBase) this.records.get(i);
-            if (rb instanceof RecordAggregate) {
-                ((RecordAggregate) rb).visitContainedRecords(new RecordCloner(clonedRecords));
-                continue;
-            }
-            Record rec = (Record) ((Record) rb).clone();
-            clonedRecords.add(rec);
-        }
-        return createSheet(clonedRecords, 0, 0);
-    }
-
-
-    /**
-     * read support  (offset = 0) Same as createSheet(Record[] recs, int, int)
-     * only the record offset is assumed to be 0.
-     *
-     * @param records  array containing those records in the sheet in sequence (normally obtained from RecordFactory)
-     * @param sheetnum integer specifying the sheet's number (0,1 or 2 in this release)
-     * @return Sheet object
-     */
-
-    public static Sheet createSheet(List records, int sheetnum)
-    {
-        if (log.check( POILogger.DEBUG ))
-            log.log(POILogger.DEBUG,
-                    "Sheet createSheet (exisiting file) assumed offset 0");
-        return createSheet(records, sheetnum, 0);
-    }
-
-    /**
-     * Creates a sheet with all the usual records minus values and the "index"
-     * record (not required).  Sets the location pointer to where the first value
-     * records should go.  Use this to create a sheet from "scratch".
-     *
-     * @return Sheet object with all values set to defaults
-     */
-
-    public static Sheet createSheet()
-    {
-        if (log.check( POILogger.DEBUG ))
-            log.log(POILogger.DEBUG, "Sheet createsheet from scratch called");
-        Sheet     retval  = new Sheet();
-        ArrayList records = new ArrayList(30);
-
-        records.add(createBOF());
-
-        // records.add(retval.createIndex());
-        records.add(createCalcMode());
-        records.add(createCalcCount() );
-        records.add(createRefMode() );
-        records.add(createIteration() );
-        records.add(createDelta() );
-        records.add(createSaveRecalc() );
-        records.add(createPrintHeaders() );
-        retval.printGridlines = createPrintGridlines();
-        records.add( retval.printGridlines );
-        retval.gridset = createGridset();
-        records.add( retval.gridset );
-        records.add( retval.createGuts() );
-        retval.defaultrowheight = createDefaultRowHeight();
-        records.add( retval.defaultrowheight );
-        records.add( retval.createWSBool() );
-        
-        // 'Page Settings Block'
-        retval._rowBreaksRecord = new HorizontalPageBreakRecord();
-        records.add(retval._rowBreaksRecord);
-        retval._columnBreaksRecord = new VerticalPageBreakRecord();
-        records.add(retval._columnBreaksRecord);
-
-        retval.header = createHeader();
-        records.add( retval.header );
-        retval.footer = createFooter();
-        records.add( retval.footer );
-        records.add(createHCenter() );
-        records.add(createVCenter() );
-        retval.printSetup = createPrintSetup();
-        records.add( retval.printSetup );
-
-        // 'Worksheet Protection Block' (after 'Page Settings Block' and before DEFCOLWIDTH)
-        // PROTECT record normally goes here, don't add yet since the flag is initially false
-        
-        retval.defaultcolwidth = createDefaultColWidth();
-        records.add( retval.defaultcolwidth);
-        ColumnInfoRecordsAggregate columns = new ColumnInfoRecordsAggregate();
-        records.add( columns );
-        retval._columnInfos = columns;
-        retval.dims    =  createDimensions();
-        records.add(retval.dims);
-        retval.dimsloc = records.size()-1;
-        records.add(retval.windowTwo = retval.createWindowTwo());
-        retval.selection = createSelection();
-        records.add(retval.selection);
-        records.add(EOFRecord.instance);
-
-
-        retval.records = records;
-        if (log.check( POILogger.DEBUG ))
-            log.log(POILogger.DEBUG, "Sheet createsheet from scratch exit");
-        return retval;
-    }
-
-    private void checkRows()
-    {
-        if (_rowsAggregate == null)
-        {
-            _rowsAggregate = new RowRecordsAggregate();
-            records.add(getDimsLoc() + 1, _rowsAggregate);
-        }
-    }
-    private MergedCellsTable getMergedRecords() {
-        if (_mergedCellsTable == null) {
-            MergedCellsTable mct = new MergedCellsTable();
-            RecordOrderer.addNewSheetRecord(records, mct);
-            _mergedCellsTable = mct;
-        }
-        return _mergedCellsTable;
-    }
-
-
-    public int addMergedRegion(int rowFrom, int colFrom, int rowTo, int colTo) {
-        // Validate input
-        if (rowTo < rowFrom) {
-            throw new IllegalArgumentException("The 'to' row (" + rowTo
-                    + ") must not be less than the 'from' row (" + rowFrom + ")");
-        }
-        if (colTo < colFrom) {
-            throw new IllegalArgumentException("The 'to' col (" + colTo
-                    + ") must not be less than the 'from' col (" + colFrom + ")");
-        }
-
-        MergedCellsTable mrt = getMergedRecords();
-        mrt.addArea(rowFrom, colFrom, rowTo, colTo);
-        return mrt.getNumberOfMergedRegions()-1;
-    }
-
-    public void removeMergedRegion(int index)
-    {
-        //safety checks
-        MergedCellsTable mrt = getMergedRecords();
-        if (index >= mrt.getNumberOfMergedRegions()) {
-            return;
-        }
-        mrt.remove(index);
-    }
-
-    public CellRangeAddress getMergedRegionAt(int index) {
-        //safety checks
-        MergedCellsTable mrt = getMergedRecords();
-        if (index >=  mrt.getNumberOfMergedRegions()) {
-            return null;
-        }
-        return mrt.get(index);
-    }
-
-    public int getNumMergedRegions() {
-        return getMergedRecords().getNumberOfMergedRegions();
-    }
-    private ConditionalFormattingTable getConditionalFormattingTable() {
-        if (condFormatting == null) {
-            condFormatting = new ConditionalFormattingTable();
-            RecordOrderer.addNewSheetRecord(records, condFormatting);
-        }
-        return condFormatting;
-    }
-
-
-    public int addConditionalFormatting(CFRecordsAggregate cfAggregate) {
-        ConditionalFormattingTable cft = getConditionalFormattingTable();
-        return cft.add(cfAggregate);
-    }
-
-    public void removeConditionalFormatting(int index) {
-        getConditionalFormattingTable().remove(index);
-    }
-
-    public CFRecordsAggregate getCFRecordsAggregateAt(int index) {
-        return getConditionalFormattingTable().get(index);
-    }
-
-    public int getNumConditionalFormattings() {
-        return getConditionalFormattingTable().size();
-    }
-
-    /**
-     * Per an earlier reported bug in working with Andy Khan's excel read library.  This
-     * sets the values in the sheet's DimensionsRecord object to be correct.  Excel doesn't
-     * really care, but we want to play nice with other libraries.
-     *
-     * @see org.apache.poi.hssf.record.DimensionsRecord
-     */
-    public void setDimensions(int firstrow, short firstcol, int lastrow,
-                              short lastcol)
-    {
-        if (log.check( POILogger.DEBUG ))
-        {
-            log.log(POILogger.DEBUG, "Sheet.setDimensions");
-            log.log(POILogger.DEBUG,
-                    (new StringBuffer("firstrow")).append(firstrow)
-                        .append("firstcol").append(firstcol).append("lastrow")
-                        .append(lastrow).append("lastcol").append(lastcol)
-                        .toString());
-        }
-        dims.setFirstCol(firstcol);
-        dims.setFirstRow(firstrow);
-        dims.setLastCol(lastcol);
-        dims.setLastRow(lastrow);
-        if (log.check( POILogger.DEBUG ))
-            log.log(POILogger.DEBUG, "Sheet.setDimensions exiting");
-    }
-
-    /**
-     * Set the preoffset when using DBCELL records (currently unused) - this is
-     * the position of this sheet within the whole file.
-     *
-     * @param offset the offset of the sheet's BOF within the file.
-     */
-
-    public void setPreOffset(int offset)
-    {
-        this.preoffset = offset;
-    }
-
-    /**
-     * get the preoffset when using DBCELL records (currently unused) - this is
-     * the position of this sheet within the whole file.
-     *
-     * @return offset the offset of the sheet's BOF within the file.
-     */
-
-    public int getPreOffset()
-    {
-        return preoffset;
-    }
-
-    /**
-     * Serializes all records in the sheet into one big byte array.  Use this to write
-     * the sheet out.
-     *
-     * @param offset to begin write at
-     * @param data   array containing the binary representation of the records in this sheet
-     *
-     */
-
-    public int serialize(int offset, byte [] data)
-    {
-        if (log.check( POILogger.DEBUG ))
-            log.log(POILogger.DEBUG, "Sheet.serialize using offsets");
-
-        int pos       = offset;
-        boolean haveSerializedIndex = false;
-
-        for (int k = 0; k < records.size(); k++)
-        {
-            RecordBase record = (RecordBase) records.get(k);
-
-            // Don't write out UncalcedRecord entries, as
-            //  we handle those specially just below
-            if (record instanceof UncalcedRecord) {
-                continue;
-            }
-
-            // Once the rows have been found in the list of records, start
-            //  writing out the blocked row information. This includes the DBCell references
-            pos += record.serialize(pos, data);
-
-            // If the BOF record was just serialized then add the IndexRecord
-            if (record instanceof BOFRecord) {
-              if (!haveSerializedIndex) {
-                haveSerializedIndex = true;
-                // Add an optional UncalcedRecord. However, we should add
-                //  it in only the once, after the sheet's own BOFRecord.
-                // If there are diagrams, they have their own BOFRecords,
-                //  and one shouldn't go in after that!
-                if (_isUncalced) {
-                    UncalcedRecord rec = new UncalcedRecord();
-                    pos += rec.serialize(pos, data);
-                }
-                //Can there be more than one BOF for a sheet? If not then we can
-                //remove this guard. So be safe it is left here.
-                if (_rowsAggregate != null) {
-                  pos += serializeIndexRecord(k, pos, data);
-                }
-              }
-            }
-        }
-        if (log.check( POILogger.DEBUG )) {
-            log.log(POILogger.DEBUG, "Sheet.serialize returning ");
-        }
-        return pos-offset;
-    }
-
-    /**
-     * @param indexRecordOffset also happens to be the end of the BOF record
-     * @return the size of the serialized INDEX record
-     */
-    private int serializeIndexRecord(int bofRecordIndex, int indexRecordOffset, byte[] data) {
-
-        // 'initial sheet records' are between INDEX and first ROW record.
-        int sizeOfInitialSheetRecords = 0;
-        // start just after BOF record (INDEX is not present in this list)
-        for (int j = bofRecordIndex + 1; j < records.size(); j++) {
-            RecordBase tmpRec = ((RecordBase) records.get(j));
-            if (tmpRec instanceof UncalcedRecord) {
-                continue;
-            }
-            if (tmpRec instanceof RowRecordsAggregate) {
-                break;
-            }
-            sizeOfInitialSheetRecords += tmpRec.getRecordSize();
-        }
-        if (_isUncalced) {
-            sizeOfInitialSheetRecords += UncalcedRecord.getStaticRecordSize();
-        }
-        IndexRecord index = _rowsAggregate.createIndexRecord(indexRecordOffset, sizeOfInitialSheetRecords);
-        return index.serialize(indexRecordOffset, data);
-    }
-
-
-    /**
-     * Create a row record.  (does not add it to the records contained in this sheet)
-     */
-    private static RowRecord createRow(int row) {
-        return RowRecordsAggregate.createRow( row );
-    }
-
-    /**
-     * Adds a value record to the sheet's contained binary records
-     * (i.e. LabelSSTRecord or NumberRecord).
-     * <P>
-     * This method is "loc" sensitive.  Meaning you need to set LOC to where you
-     * want it to start searching.  If you don't know do this: setLoc(getDimsLoc).
-     * When adding several rows you can just start at the last one by leaving loc
-     * at what this sets it to.
-     *
-     * @param row the row to add the cell value to
-     * @param col the cell value record itself.
-     */
-    public void addValueRecord(int row, CellValueRecordInterface col) {
-
-        if(log.check(POILogger.DEBUG)) {
-          log.log(POILogger.DEBUG, "add value record  row" + row);
-        }
-        DimensionsRecord d = ( DimensionsRecord ) records.get(getDimsLoc());
-
-        if (col.getColumn() > d.getLastCol())
-        {
-            d.setLastCol(( short ) (col.getColumn() + 1));
-        }
-        if (col.getColumn() < d.getFirstCol())
-        {
-            d.setFirstCol(col.getColumn());
-        }
-        _rowsAggregate.insertCell(col);
-    }
-
-    /**
-     * remove a value record from the records array.
-     *
-     * This method is not loc sensitive, it resets loc to = dimsloc so no worries.
-     *
-     * @param row - the row of the value record you wish to remove
-     * @param col - a record supporting the CellValueRecordInterface.
-     * @see org.apache.poi.hssf.record.CellValueRecordInterface
-     */
-    public void removeValueRecord(int row, CellValueRecordInterface col) {
-
-        log.logFormatted(POILogger.DEBUG, "remove value record row,dimsloc %,%",
-                         new int[]{row, dimsloc} );
-        _rowsAggregate.removeCell(col);
-    }
-
-    /**
-     * replace a value record from the records array.
-     *
-     * This method is not loc sensitive, it resets loc to = dimsloc so no worries.
-     *
-     * @param newval - a record supporting the CellValueRecordInterface.  this will replace
-     *                the cell value with the same row and column.  If there isn't one, one will
-     *                be added.
-     */
-
-    public void replaceValueRecord(CellValueRecordInterface newval) {
-
-        if (log.check( POILogger.DEBUG ))
-            log.log(POILogger.DEBUG, "replaceValueRecord ");
-        //The ValueRecordsAggregate use a tree map underneath.
-        //The tree Map uses the CellValueRecordInterface as both the
-        //key and the value, if we dont do a remove, then
-        //the previous instance of the key is retained, effectively using
-        //double the memory
-        _rowsAggregate.removeCell(newval);
-        _rowsAggregate.insertCell(newval);
-    }
-
-    /**
-     * Adds a row record to the sheet
-     *
-     * <P>
-     * This method is "loc" sensitive.  Meaning you need to set LOC to where you
-     * want it to start searching.  If you don't know do this: setLoc(getDimsLoc).
-     * When adding several rows you can just start at the last one by leaving loc
-     * at what this sets it to.
-     *
-     * @param row the row record to be added
-     * @see #setLoc(int)
-     */
-
-    public void addRow(RowRecord row)
-    {
-        checkRows();
-        if (log.check( POILogger.DEBUG ))
-            log.log(POILogger.DEBUG, "addRow ");
-        DimensionsRecord d = ( DimensionsRecord ) records.get(getDimsLoc());
-
-        if (row.getRowNumber() >= d.getLastRow())
-        {
-            d.setLastRow(row.getRowNumber() + 1);
-        }
-        if (row.getRowNumber() < d.getFirstRow())
-        {
-            d.setFirstRow(row.getRowNumber());
-        }
-
-        //If the row exists remove it, so that any cells attached to the row are removed
-        RowRecord existingRow = _rowsAggregate.getRow(row.getRowNumber());
-        if (existingRow != null) {
-            _rowsAggregate.removeRow(existingRow);
-        }
-
-        _rowsAggregate.insertRow(row);
-
-        if (log.check( POILogger.DEBUG ))
-            log.log(POILogger.DEBUG, "exit addRow");
-    }
-
-    /**
-     * Removes a row record
-     *
-     * This method is not loc sensitive, it resets loc to = dimsloc so no worries.
-     *
-     * @param row  the row record to remove
-     */
-    public void removeRow(RowRecord row) {
-        checkRows();
-        _rowsAggregate.removeRow(row);
-    }
-
-    /**
-     * get the NEXT value record (from LOC).  The first record that is a value record
-     * (starting at LOC) will be returned.
-     *
-     * <P>
-     * This method is "loc" sensitive.  Meaning you need to set LOC to where you
-     * want it to start searching.  If you don't know do this: setLoc(getDimsLoc).
-     * When adding several rows you can just start at the last one by leaving loc
-     * at what this sets it to.  For this method, set loc to dimsloc to start with,
-     * subsequent calls will return values in (physical) sequence or NULL when you get to the end.
-     *
-     * @return CellValueRecordInterface representing the next value record or NULL if there are no more
-     * @see #setLoc(int)
-     */
-    public CellValueRecordInterface[] getValueRecords() {
-        return _rowsAggregate.getValueRecords();
-    }
-
-    /**
-     * get the NEXT RowRecord (from LOC).  The first record that is a Row record
-     * (starting at LOC) will be returned.
-     * <P>
-     * This method is "loc" sensitive.  Meaning you need to set LOC to where you
-     * want it to start searching.  If you don't know do this: setLoc(getDimsLoc).
-     * When adding several rows you can just start at the last one by leaving loc
-     * at what this sets it to.  For this method, set loc to dimsloc to start with.
-     * subsequent calls will return rows in (physical) sequence or NULL when you get to the end.
-     *
-     * @return RowRecord representing the next row record or NULL if there are no more
-     * @see #setLoc(int)
-     *
-     */
-    public RowRecord getNextRow() {
-        if (rowRecIterator == null)
-        {
-            rowRecIterator = _rowsAggregate.getIterator();
-        }
-        if (!rowRecIterator.hasNext())
-        {
-            return null;
-        }
-        return ( RowRecord ) rowRecIterator.next();
-    }
-
-    /**
-     * get the NEXT (from LOC) RowRecord where rownumber matches the given rownum.
-     * The first record that is a Row record (starting at LOC) that has the
-     * same rownum as the given rownum will be returned.
-     * <P>
-     * This method is "loc" sensitive.  Meaning you need to set LOC to where you
-     * want it to start searching.  If you don't know do this: setLoc(getDimsLoc).
-     * When adding several rows you can just start at the last one by leaving loc
-     * at what this sets it to.  For this method, set loc to dimsloc to start with.
-     * subsequent calls will return rows in (physical) sequence or NULL when you get to the end.
-     *
-     * @param rownum   which row to return (careful with LOC)
-     * @return RowRecord representing the next row record or NULL if there are no more
-     * @see #setLoc(int)
-     *
-     */
-    public RowRecord getRow(int rownum) {
-        return _rowsAggregate.getRow(rownum);
-    }
-
-    /**
-     * creates the BOF record
-     */
-    private static BOFRecord createBOF() {
-        BOFRecord retval = new BOFRecord();
-
-        retval.setVersion(( short ) 0x600);
-        retval.setType(( short ) 0x010);
-
-        retval.setBuild(( short ) 0x0dbb);
-        retval.setBuildYear(( short ) 1996);
-        retval.setHistoryBitMask(0xc1);
-        retval.setRequiredVersion(0x6);
-        return retval;
-    }
-
-    /**
-     * creates the CalcMode record and sets it to 1 (automatic formula caculation)
-     */
-    private static CalcModeRecord createCalcMode() {
-        CalcModeRecord retval = new CalcModeRecord();
-
-        retval.setCalcMode(( short ) 1);
-        return retval;
-    }
-
-    /**
-     * creates the CalcCount record and sets it to 100 (default number of iterations)
-     */
-    private static CalcCountRecord createCalcCount() {
-        CalcCountRecord retval = new CalcCountRecord();
-
-        retval.setIterations(( short ) 100);   // default 100 iterations
-        return retval;
-    }
-
-    /**
-     * creates the RefMode record and sets it to A1 Mode (default reference mode)
-     */
-    private static RefModeRecord createRefMode() {
-        RefModeRecord retval = new RefModeRecord();
-
-        retval.setMode(RefModeRecord.USE_A1_MODE);
-        return retval;
-    }
-
-    /**
-     * creates the Iteration record and sets it to false (don't iteratively calculate formulas)
-     */
-    private static IterationRecord createIteration() {
-        IterationRecord retval = new IterationRecord();
-
-        retval.setIteration(false);
-        return retval;
-    }
-
-    /**
-     * creates the Delta record and sets it to 0.0010 (default accuracy)
-     */
-    private static DeltaRecord createDelta() {
-        DeltaRecord retval = new DeltaRecord();
-
-        retval.setMaxChange(0.0010);
-        return retval;
-    }
-
-    /**
-     * creates the SaveRecalc record and sets it to true (recalculate before saving)
-     */
-    private static SaveRecalcRecord createSaveRecalc() {
-        SaveRecalcRecord retval = new SaveRecalcRecord();
-
-        retval.setRecalc(true);
-        return retval;
-    }
-
-    /**
-     * creates the PrintHeaders record and sets it to false (we don't create headers yet so why print them)
-     */
-    private static PrintHeadersRecord createPrintHeaders() {
-        PrintHeadersRecord retval = new PrintHeadersRecord();
-
-        retval.setPrintHeaders(false);
-        return retval;
-    }
-
-    /**
-     * creates the PrintGridlines record and sets it to false (that makes for ugly sheets).  As far as I can
-     * tell this does the same thing as the GridsetRecord
-     */
-    private static PrintGridlinesRecord createPrintGridlines() {
-        PrintGridlinesRecord retval = new PrintGridlinesRecord();
-
-        retval.setPrintGridlines(false);
-        return retval;
-    }
-
-    /**
-     * creates the Gridset record and sets it to true (user has mucked with the gridlines)
-     */
-    private static GridsetRecord createGridset() {
-        GridsetRecord retval = new GridsetRecord();
-
-        retval.setGridset(true);
-        return retval;
-    }
-
-    /**
-     * creates the Guts record and sets leftrow/topcol guttter and rowlevelmax/collevelmax to 0
-      */
-    private static GutsRecord createGuts() {
-        GutsRecord retval = new GutsRecord();
-
-        retval.setLeftRowGutter(( short ) 0);
-        retval.setTopColGutter(( short ) 0);
-        retval.setRowLevelMax(( short ) 0);
-        retval.setColLevelMax(( short ) 0);
-        return retval;
-    }
-    private GutsRecord getGutsRecord() {
-        if (_gutsRecord == null) {
-            GutsRecord result = createGuts();
-            RecordOrderer.addNewSheetRecord(records, result);
-            _gutsRecord = result;
-        }
-
-        return _gutsRecord;
-    }
-
-    /**
-     * creates the DefaultRowHeight Record and sets its options to 0 and rowheight to 0xff
-     */
-    private static DefaultRowHeightRecord createDefaultRowHeight() {
-        DefaultRowHeightRecord retval = new DefaultRowHeightRecord();
-
-        retval.setOptionFlags(( short ) 0);
-        retval.setRowHeight(( short ) 0xff);
-        return retval;
-    }
-
-    /**
-     * creates the WSBoolRecord and sets its values to defaults
-     */
-    private static WSBoolRecord createWSBool() {
-        WSBoolRecord retval = new WSBoolRecord();
-
-        retval.setWSBool1(( byte ) 0x4);
-        retval.setWSBool2(( byte ) 0xffffffc1);
-        return retval;
-    }
-
-    /**
-     * creates the Header Record and sets it to nothing/0 length
-     */
-    private static HeaderRecord createHeader() {
-        HeaderRecord retval = new HeaderRecord();
-
-        retval.setHeaderLength(( byte ) 0);
-        retval.setHeader(null);
-        return retval;
-    }
-
-    /**
-     * creates the Footer Record and sets it to nothing/0 length
-     */
-    private static FooterRecord createFooter() {
-        FooterRecord retval = new FooterRecord();
-
-        retval.setFooterLength(( byte ) 0);
-        retval.setFooter(null);
-        return retval;
-    }
-
-    /**
-     * creates the HCenter Record and sets it to false (don't horizontally center)
-     */
-    private static HCenterRecord createHCenter() {
-        HCenterRecord retval = new HCenterRecord();
-
-        retval.setHCenter(false);
-        return retval;
-    }
-
-    /**
-     * creates the VCenter Record and sets it to false (don't horizontally center)
-    */
-    private static VCenterRecord createVCenter() {
-        VCenterRecord retval = new VCenterRecord();
-
-        retval.setVCenter(false);
-        return retval;
-    }
-
-    /**
-     * creates the PrintSetup Record and sets it to defaults and marks it invalid
-     * @see org.apache.poi.hssf.record.PrintSetupRecord
-     * @see org.apache.poi.hssf.record.Record
-     * @return record containing a PrintSetupRecord
-     */
-    private static PrintSetupRecord createPrintSetup() {
-        PrintSetupRecord retval = new PrintSetupRecord();
-
-        retval.setPaperSize(( short ) 1);
-        retval.setScale(( short ) 100);
-        retval.setPageStart(( short ) 1);
-        retval.setFitWidth(( short ) 1);
-        retval.setFitHeight(( short ) 1);
-        retval.setOptions(( short ) 2);
-        retval.setHResolution(( short ) 300);
-        retval.setVResolution(( short ) 300);
-        retval.setHeaderMargin( 0.5);
-        retval.setFooterMargin( 0.5);
-        retval.setCopies(( short ) 0);
-        return retval;
-    }
-
-    /**
-     * creates the DefaultColWidth Record and sets it to 8
-      */
-    private static DefaultColWidthRecord createDefaultColWidth() {
-        DefaultColWidthRecord retval = new DefaultColWidthRecord();
-        retval.setColWidth(( short ) 8);
-        return retval;
-    }
-
-    /**
-     * get the default column width for the sheet (if the columns do not define their own width)
-     * @return default column width
-     */
-
-    public short getDefaultColumnWidth()
-    {
-        return defaultcolwidth.getColWidth();
-    }
-
-    /**
-     * get whether gridlines are printed.
-     * @return true if printed
-     */
-
-    public boolean isGridsPrinted()
-    {
-        if (gridset == null) {
-            gridset = createGridset();
-            //Insert the newlycreated Gridset record at the end of the record (just before the EOF)
-            int loc = findFirstRecordLocBySid(EOFRecord.sid);
-            records.add(loc, gridset);
-        }
-        return !gridset.getGridset();
-    }
-
-    /**
-     * set whether gridlines printed or not.
-     * @param value     True if gridlines printed.
-     */
-
-    public void setGridsPrinted(boolean value)
-    {
-        gridset.setGridset(!value);
-    }
-
-    /**
-     * set the default column width for the sheet (if the columns do not define their own width)
-     * @param dcw  default column width
-     */
-
-    public void setDefaultColumnWidth(short dcw)
-    {
-        defaultcolwidth.setColWidth(dcw);
-    }
-
-    /**
-     * set the default row height for the sheet (if the rows do not define their own height)
-     */
-
-    public void setDefaultRowHeight(short dch)
-    {
-        defaultrowheight.setRowHeight(dch);
-    }
-
-    /**
-     * get the default row height for the sheet (if the rows do not define their own height)
-     * @return  default row height
-     */
-
-    public short getDefaultRowHeight()
-    {
-        return defaultrowheight.getRowHeight();
-    }
-
-    /**
-     * get the width of a given column in units of 1/256th of a character width
-     * @param columnIndex index
-     * @see org.apache.poi.hssf.record.DefaultColWidthRecord
-     * @see org.apache.poi.hssf.record.ColumnInfoRecord
-     * @see #setColumnWidth(short,short)
-     * @return column width in units of 1/256th of a character width
-     */
-
-    public short getColumnWidth(short columnIndex) {
-
-        ColumnInfoRecord ci = _columnInfos.findColumnInfo(columnIndex);
-        if (ci != null) {
-            return ci.getColumnWidth();
-        }
-        //default column width is measured in characters
-        //multiply
-        return (short)(256*defaultcolwidth.getColWidth());
-    }
-
-    /**
-     * get the index to the ExtendedFormatRecord "associated" with
-     * the column at specified 0-based index. (In this case, an
-     * ExtendedFormatRecord index is actually associated with a
-     * ColumnInfoRecord which spans 1 or more columns)
-     * <br/>
-     * Returns the index to the default ExtendedFormatRecord (0xF)
-     * if no ColumnInfoRecord exists that includes the column
-     * index specified.
-     * @param columnIndex
-     * @return index of ExtendedFormatRecord associated with
-     * ColumnInfoRecord that includes the column index or the
-     * index of the default ExtendedFormatRecord (0xF)
-     */
-    public short getXFIndexForColAt(short columnIndex) {
-        ColumnInfoRecord ci = _columnInfos.findColumnInfo(columnIndex);
-        if (ci != null) {
-            return ci.getXFIndex();
-         }
-        return 0xF;
-    }
-
-    /**
-     * set the width for a given column in 1/256th of a character width units
-     * 
-     * @param column -
-     *            the column number
-     * @param width
-     *            (in units of 1/256th of a character width)
-     */
-    public void setColumnWidth(short column, short width) {
-        setColumn( column, new Short(width), null, null, null);
-    }
-
-    /**
-     * Get the hidden property for a given column.
-     * @param column index
-     * @see org.apache.poi.hssf.record.DefaultColWidthRecord
-     * @see org.apache.poi.hssf.record.ColumnInfoRecord
-     * @see #setColumnHidden(short,boolean)
-     * @return whether the column is hidden or not.
-     */
-    public boolean isColumnHidden(short columnIndex) {
-        ColumnInfoRecord cir = _columnInfos.findColumnInfo(columnIndex);
-        if (cir == null) {
-            return false;
-        }
-        return cir.getHidden();
-    }
-
-    /**
-     * Get the hidden property for a given column.
-     * @param column - the column number
-     * @param hidden - whether the column is hidden or not
-     */
-    public void setColumnHidden(short column, boolean hidden)
-    {
-        setColumn( column, null, null, new Boolean(hidden), null);
-    }
-
-    public void setColumn(short column, Short width, Integer level, Boolean hidden, Boolean collapsed) {
-        _columnInfos.setColumn( column, null, width, level, hidden, collapsed );
-    }
-
-    public void setColumn(short column, Short xfStyle, Short width, Integer level, Boolean hidden, Boolean collapsed) {
-        _columnInfos.setColumn( column, xfStyle, width, level, hidden, collapsed );
-    }
-
-
-    /**
-     * Creates an outline group for the specified columns.
-     * @param fromColumn    group from this column (inclusive)
-     * @param toColumn      group to this column (inclusive)
-     * @param indent        if true the group will be indented by one level,
-     *                      if false indenting will be removed by one level.
-     */
-    public void groupColumnRange(short fromColumn, short toColumn, boolean indent)
-    {
-
-        // Set the level for each column
-        _columnInfos.groupColumnRange( fromColumn, toColumn, indent);
-
-        // Determine the maximum overall level
-        int maxLevel = _columnInfos.getMaxOutlineLevel();
-
-        GutsRecord guts = getGutsRecord();
-        guts.setColLevelMax( (short) ( maxLevel+1 ) );
-        if (maxLevel == 0) {
-            guts.setTopColGutter( (short)0 );
-        } else {
-            guts.setTopColGutter( (short) ( 29 + (12 * (maxLevel-1)) ) );
-        }
-    }
-
-    /**
-     * creates the Dimensions Record and sets it to bogus values (you should set this yourself
-     * or let the high level API do it for you)
-     */
-    private static DimensionsRecord createDimensions() {
-        DimensionsRecord retval = new DimensionsRecord();
-
-        retval.setFirstCol(( short ) 0);
-        retval.setLastRow(1);             // one more than it is
-        retval.setFirstRow(0);
-        retval.setLastCol(( short ) 1);   // one more than it is
-        return retval;
-    }
-
-    /**
-     * creates the WindowTwo Record and sets it to:  <P>
-     * options        = 0x6b6 <P>
-     * toprow         = 0 <P>
-     * leftcol        = 0 <P>
-     * headercolor    = 0x40 <P>
-     * pagebreakzoom  = 0x0 <P>
-     * normalzoom     = 0x0 <p>
-     */
-    private static WindowTwoRecord createWindowTwo() {
-        WindowTwoRecord retval = new WindowTwoRecord();
-
-        retval.setOptions(( short ) 0x6b6);
-        retval.setTopRow(( short ) 0);
-        retval.setLeftCol(( short ) 0);
-        retval.setHeaderColor(0x40);
-        retval.setPageBreakZoom(( short ) 0);
-        retval.setNormalZoom(( short ) 0);
-        return retval;
-    }
-
-    /**
-     * Creates the Selection record and sets it to nothing selected
-    */
-    private static SelectionRecord createSelection() {
-        return new SelectionRecord(0, 0);
-    }
-
-    public short getTopRow()
-    {
-        return (windowTwo==null) ? (short) 0 : windowTwo.getTopRow();
-    }
-
-    public void setTopRow(short topRow)
-    {
-        if (windowTwo!=null)
-        {
-            windowTwo.setTopRow(topRow);
-        }
-    }
-
-    /**
-     * Sets the left column to show in desktop window pane.
-     * @param leftCol the left column to show in desktop window pane
-     */
-    public void setLeftCol(short leftCol){
-        if (windowTwo!=null) {
-            windowTwo.setLeftCol(leftCol);
-        }
-    }
-
-    public short getLeftCol() {
-        return (windowTwo==null) ? (short) 0 : windowTwo.getLeftCol();
-    }
-
-    /**
-     * Returns the active row
-     *
-     * @see org.apache.poi.hssf.record.SelectionRecord
-     * @return row the active row index
-     */
-    public int getActiveCellRow()
-    {
-        if (selection == null)
-        {
-            return 0;
-        }
-        return selection.getActiveCellRow();
-    }
-
-    /**
-     * Sets the active row
-     *
-     * @param row the row index
-     * @see org.apache.poi.hssf.record.SelectionRecord
-     */
-    public void setActiveCellRow(int row)
-    {
-        //shouldn't have a sheet w/o a SelectionRecord, but best to guard anyway
-        if (selection != null)
-        {
-            selection.setActiveCellRow(row);
-        }
-    }
-
-    /**
-     * @see org.apache.poi.hssf.record.SelectionRecord
-     * @return column of the active cell
-     */
-    public short getActiveCellCol() {
-        if (selection == null) {
-            return 0;
-        }
-        return (short)selection.getActiveCellCol();
-    }
-
-    /**
-     * Sets the active column
-     *
-     * @param col the column index
-     * @see org.apache.poi.hssf.record.SelectionRecord
-     */
-    public void setActiveCellCol(short col)
-    {
-        //shouldn't have a sheet w/o a SelectionRecord, but best to guard anyway
-        if (selection != null)
-        {
-            selection.setActiveCellCol(col);
-        }
-    }
-
-    /**
-     * get the location of the DimensionsRecord (which is the last record before the value section)
-     * @return location in the array of records of the DimensionsRecord
-     */
-
-    public int getDimsLoc()
-    {
-        if (log.check( POILogger.DEBUG ))
-            log.log(POILogger.DEBUG, "getDimsLoc dimsloc= " + dimsloc);
-        return dimsloc;
-    }
-
-    /**
-     * in the event the record is a dimensions record, resets both the loc index and dimsloc index
-     */
-    public void checkDimsLoc(Record rec, int recloc) {
-        if (rec.getSid() == DimensionsRecord.sid) {
-            dimsloc = recloc;
-        }
-    }
-
-    /**
-     * @return the serialized size of this sheet
-     */
-    public int getSize() {
-        int retval = 0;
-
-        for ( int k = 0; k < records.size(); k++) {
-            RecordBase record = (RecordBase) records.get(k);
-            if (record instanceof UncalcedRecord) {
-                // skip the UncalcedRecord if present, it's only encoded if the isUncalced flag is set
-                continue;
-            }
-            retval += record.getRecordSize();
-        }
-        // add space for IndexRecord if needed
-        if (_rowsAggregate != null) {
-            // rowsAggregate knows how to make the index record
-            retval += IndexRecord.getRecordSizeForBlockCount(_rowsAggregate.getRowBlockCount());
-        }
-        // Add space for UncalcedRecord
-        if (_isUncalced) {
-            retval += UncalcedRecord.getStaticRecordSize();
-        }
-        return retval;
-    }
-
-    public List getRecords()
-    {
-        return records;
-    }
-
-    /**
-     * Gets the gridset record for this sheet.
-     */
-
-    public GridsetRecord getGridsetRecord()
-    {
-        return gridset;
-    }
-
-    /**
-     * Returns the first occurance of a record matching a particular sid.
-     */
-
-    public Record findFirstRecordBySid(short sid)
-    {
-        int ix = findFirstRecordLocBySid(sid);
-        if (ix < 0) {
-            return null;
-        }
-        return (Record) records.get(ix);
-    }
-
-    /**
-     * Sets the SCL record or creates it in the correct place if it does not
-     * already exist.
-     *
-     * @param sclRecord     The record to set.
-     */
-    public void setSCLRecord(SCLRecord sclRecord)
-    {
-        int oldRecordLoc = findFirstRecordLocBySid(SCLRecord.sid);
-        if (oldRecordLoc == -1)
-        {
-            // Insert it after the window record
-            int windowRecordLoc = findFirstRecordLocBySid(WindowTwoRecord.sid);
-            records.add(windowRecordLoc+1, sclRecord);
-        }
-        else
-        {
-            records.set(oldRecordLoc, sclRecord);
-        }
-
-    }
-
-    /**
-     * Finds the first occurrence of a record matching a particular sid and
-     * returns it's position.
-     * @param sid   the sid to search for
-     * @return  the record position of the matching record or -1 if no match
-     *          is made.
-     */
-    public int findFirstRecordLocBySid( short sid ) { // TODO - remove this method
-        int max = records.size();
-        for (int i=0; i< max; i++) {
-            Object rb = records.get(i);
-            if (!(rb instanceof Record)) {
-                continue;
-            }
-            Record record = (Record) rb;
-            if (record.getSid() == sid) {
-                return i;
-            }
-        }
-        return -1;
-    }
-
-    /**
-     * Returns the HeaderRecord.
-     * @return HeaderRecord for the sheet.
-     */
-    public HeaderRecord getHeader ()
-    {
-    return header;
-    }
-
-    public WindowTwoRecord getWindowTwo() {
-        return windowTwo;
-    }
-    /**
-     * Sets the HeaderRecord.
-     * @param newHeader The new HeaderRecord for the sheet.
-     */
-    public void setHeader (HeaderRecord newHeader)
-    {
-        header = newHeader;
-    }
-
-    /**
-     * Returns the FooterRecord.
-     * @return FooterRecord for the sheet.
-     */
-    public FooterRecord getFooter ()
-    {
-        return footer;
-    }
-
-    /**
-     * Sets the FooterRecord.
-     * @param newFooter The new FooterRecord for the sheet.
-     */
-    public void setFooter (FooterRecord newFooter)
-    {
-        footer = newFooter;
-    }
-
-    /**
-     * Returns the PrintSetupRecord.
-     * @return PrintSetupRecord for the sheet.
-     */
-    public PrintSetupRecord getPrintSetup ()
-    {
-        return printSetup;
-    }
-
-    /**
-     * Sets the PrintSetupRecord.
-     * @param newPrintSetup The new PrintSetupRecord for the sheet.
-     */
-    public void setPrintSetup (PrintSetupRecord newPrintSetup)
-    {
-        printSetup = newPrintSetup;
-    }
-
-    /**
-     * Returns the PrintGridlinesRecord.
-     * @return PrintGridlinesRecord for the sheet.
-     */
-    public PrintGridlinesRecord getPrintGridlines ()
-    {
-        return printGridlines;
-    }
-
-    /**
-     * Sets the PrintGridlinesRecord.
-     * @param newPrintGridlines The new PrintGridlinesRecord for the sheet.
-     */
-    public void setPrintGridlines (PrintGridlinesRecord newPrintGridlines)
-    {
-        printGridlines = newPrintGridlines;
+public final class PageSettingsBlock extends RecordAggregate {
+	// Every one of these component records is optional 
+	// (The whole PageSettingsBlock may not be present) 
+	private PageBreakRecord _rowBreaksRecord;
+	private PageBreakRecord _columnBreaksRecord;
+	private HeaderRecord header;
+	private FooterRecord footer;
+	private HCenterRecord _hCenter;
+	private VCenterRecord _vCenter;
+	private LeftMarginRecord _leftMargin;
+	private RightMarginRecord _rightMargin;
+	private TopMarginRecord _topMargin;
+	private BottomMarginRecord _bottomMargin;
+	private Record _pls;
+	private PrintSetupRecord printSetup;
+	private Record _bitmap;
+
+    public PageSettingsBlock(RecordStream rs) {
+    	while(true) {
+    		if (!readARecord(rs)) {
+    			break;
+    		}
+    	}
     }
 
     /**
-     * Sets whether the sheet is selected
-     * @param sel True to select the sheet, false otherwise.
-     */
-    public void setSelected(boolean sel) {
-        windowTwo.setSelected(sel);
+     * Creates a PageSettingsBlock with default settings
+     */
+    public PageSettingsBlock() {
+        _rowBreaksRecord = new HorizontalPageBreakRecord();
+        _columnBreaksRecord = new VerticalPageBreakRecord();
+        header = createHeader();
+        footer = createFooter();
+        _hCenter = createHCenter();
+        _vCenter = createVCenter();
+        printSetup = createPrintSetup();
+	}
+
+    /**
+     * @return <code>true</code> if the specified Record sid is one belonging to the 
+     * 'Page Settings Block'.
+     */
+	public static boolean isComponentRecord(int sid) {
+		switch (sid) {
+			case HorizontalPageBreakRecord.sid:
+			case VerticalPageBreakRecord.sid:
+			case HeaderRecord.sid:
+			case FooterRecord.sid:
+			case HCenterRecord.sid:
+			case VCenterRecord.sid:
+			case LeftMarginRecord.sid:
+			case RightMarginRecord.sid:
+			case TopMarginRecord.sid:
+			case BottomMarginRecord.sid:
+			case 0x004D: // PLS
+			case PrintSetupRecord.sid:
+			case 0x00E9: // BITMAP
+				return true;
+		}
+		return false;
     }
+    
+	private boolean readARecord(RecordStream rs) {
+		switch (rs.peekNextSid()) {
+			case HorizontalPageBreakRecord.sid:
+				_rowBreaksRecord = (PageBreakRecord) rs.getNext();
+				break;
+			case VerticalPageBreakRecord.sid:
+				_columnBreaksRecord = (PageBreakRecord) rs.getNext();
+				break;
+			case HeaderRecord.sid:
+				header = (HeaderRecord) rs.getNext();
+				break;
+			case FooterRecord.sid:
+				footer = (FooterRecord) rs.getNext();
+				break;
+			case HCenterRecord.sid:
+				_hCenter = (HCenterRecord) rs.getNext();
+				break;
+			case VCenterRecord.sid:
+				_vCenter = (VCenterRecord) rs.getNext();
+				break;
+			case LeftMarginRecord.sid:
+				_leftMargin = (LeftMarginRecord) rs.getNext();
+				break;
+			case RightMarginRecord.sid:
+				_rightMargin = (RightMarginRecord) rs.getNext();
+				break;
+			case TopMarginRecord.sid:
+				_topMargin = (TopMarginRecord) rs.getNext();
+				break;
+			case BottomMarginRecord.sid:
+				_bottomMargin = (BottomMarginRecord) rs.getNext();
+				break;
+			case 0x004D: // PLS
+				_pls = rs.getNext();
+				break;
+			case PrintSetupRecord.sid:
+				printSetup = (PrintSetupRecord)rs.getNext();
+				break;
+			case 0x00E9: // BITMAP
+				_bitmap = rs.getNext();
+				break;
+			default:
+				// all other record types are not part of the PageSettingsBlock
+				return false;
+		}
+		return true;
+	}
 
-     /**
-      * Gets the size of the margin in inches.
-      * @param margin which margin to get
-      * @return the size of the margin
-      */
-    public double getMargin(short margin) {
-    if (getMargins()[margin] != null)
-        return margins[margin].getMargin();
-    else {
-        switch ( margin )
-        {
-        case LeftMargin:
-            return .75;
-        case RightMargin:
-            return .75;
-        case TopMargin:
-            return 1.0;
-        case BottomMargin:
-            return 1.0;
-        default :
-            throw new RuntimeException( "Unknown margin constant:  " + margin );
+    private PageBreakRecord getRowBreaksRecord() {
+        if (_rowBreaksRecord == null) {
+            _rowBreaksRecord = new HorizontalPageBreakRecord();
         }
+        return _rowBreaksRecord;
     }
-    }
-
-     /**
-      * Sets the size of the margin in inches.
-      * @param margin which margin to get
-      * @param size the size of the margin
-      */
-    public void setMargin(short margin, double size) {
-    Margin m = getMargins()[margin];
-    if (m  == null) {
-        switch ( margin )
-        {
-        case LeftMargin:
-            m = new LeftMarginRecord();
-            records.add( getDimsLoc() + 1, m );
-            break;
-        case RightMargin:
-            m = new RightMarginRecord();
-            records.add( getDimsLoc() + 1, m );
-            break;
-        case TopMargin:
-            m = new TopMarginRecord();
-            records.add( getDimsLoc() + 1, m );
-            break;
-        case BottomMargin:
-            m = new BottomMarginRecord();
-            records.add( getDimsLoc() + 1, m );
-            break;
-        default :
-            throw new RuntimeException( "Unknown margin constant:  " + margin );
+    
+    private PageBreakRecord getColumnBreaksRecord() {
+        if (_columnBreaksRecord == null) {
+            _columnBreaksRecord = new VerticalPageBreakRecord();
         }
-        margins[margin] = m;
-    }
-    m.setMargin( size );
-    }
-
-    public int getEofLoc()
-    {
-        return eofLoc;
+        return _columnBreaksRecord;
     }
-
+	
+	
     /**
-     * Creates a split (freezepane). Any existing freezepane or split pane is overwritten.
-     * @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.
+     * Sets a page break at the indicated column
+     *
      */
-    public void createFreezePane(int colSplit, int rowSplit, int topRow, int leftmostColumn )
-    {
-        int paneLoc = findFirstRecordLocBySid(PaneRecord.sid);
-        if (paneLoc != -1)
-            records.remove(paneLoc);
-
-        int loc = findFirstRecordLocBySid(WindowTwoRecord.sid);
-        PaneRecord pane = new PaneRecord();
-        pane.setX((short)colSplit);
-        pane.setY((short)rowSplit);
-        pane.setTopRow((short) topRow);
-        pane.setLeftColumn((short) leftmostColumn);
-        if (rowSplit == 0)
-        {
-            pane.setTopRow((short)0);
-            pane.setActivePane((short)1);
-        }
-        else if (colSplit == 0)
-        {
-            pane.setLeftColumn((short)64);
-            pane.setActivePane((short)2);
-        }
-        else
-        {
-            pane.setActivePane((short)0);
-        }
-        records.add(loc+1, pane);
-
-        windowTwo.setFreezePanes(true);
-        windowTwo.setFreezePanesNoSplit(true);
-
-        SelectionRecord sel = (SelectionRecord) findFirstRecordBySid(SelectionRecord.sid);
-        sel.setPane((byte)pane.getActivePane());
-
+    public void setColumnBreak(short column, short fromRow, short toRow) {
+        getColumnBreaksRecord().addBreak(column, fromRow, toRow);
     }
 
     /**
-     * Creates a split pane. Any existing freezepane or split pane is overwritten.
-     * @param xSplitPos      Horizonatal position of split (in 1/20th of a point).
-     * @param ySplitPos      Vertical position of split (in 1/20th of a point).
-     * @param topRow        Top row visible in bottom pane
-     * @param leftmostColumn   Left column visible in right pane.
-     * @param activePane    Active pane.  One of: PANE_LOWER_RIGHT,
-     *                      PANE_UPPER_RIGHT, PANE_LOWER_LEFT, PANE_UPPER_LEFT
-     * @see #PANE_LOWER_LEFT
-     * @see #PANE_LOWER_RIGHT
-     * @see #PANE_UPPER_LEFT
-     * @see #PANE_UPPER_RIGHT
+     * Removes a page break at the indicated column
+     *
      */
-    public void createSplitPane(int xSplitPos, int ySplitPos, int topRow, int leftmostColumn, int activePane )
-    {
-        int paneLoc = findFirstRecordLocBySid(PaneRecord.sid);
-        if (paneLoc != -1)
-            records.remove(paneLoc);
-
-        int loc = findFirstRecordLocBySid(WindowTwoRecord.sid);
-        PaneRecord r = new PaneRecord();
-        r.setX((short)xSplitPos);
-        r.setY((short)ySplitPos);
-        r.setTopRow((short) topRow);
-        r.setLeftColumn((short) leftmostColumn);
-        r.setActivePane((short) activePane);
-        records.add(loc+1, r);
-
-        windowTwo.setFreezePanes(false);
-        windowTwo.setFreezePanesNoSplit(false);
-
-        SelectionRecord sel = (SelectionRecord) findFirstRecordBySid(SelectionRecord.sid);
-        sel.setPane(PANE_LOWER_RIGHT);
-
+    public void removeColumnBreak(short column) {
+        getColumnBreaksRecord().removeBreak(column);
     }
-
+	
+	
+	
+
+	public void visitContainedRecords(RecordVisitor rv) {
+        visitIfPresent(_rowBreaksRecord, rv);
+        visitIfPresent(_columnBreaksRecord, rv);
+        visitIfPresent(header, rv);
+        visitIfPresent(footer, rv);
+        visitIfPresent(_hCenter, rv);
+        visitIfPresent(_vCenter, rv);
+        visitIfPresent(_leftMargin, rv);
+        visitIfPresent(_rightMargin, rv);
+        visitIfPresent(_topMargin, rv);
+        visitIfPresent(_bottomMargin, rv);
+        visitIfPresent(_pls, rv);
+        visitIfPresent(printSetup, rv);
+        visitIfPresent(_bitmap, rv);
+	}
+	private static void visitIfPresent(Record r, RecordVisitor rv) {
+		if (r != null) {
+			rv.visitRecord(r);
+		}
+	}
+	
     /**
-     * Returns the information regarding the currently configured pane (split or freeze).
-     * @return null if no pane configured, or the pane information.
+     * creates the Header Record and sets it to nothing/0 length
      */
-    public PaneInformation getPaneInformation() {
-      PaneRecord rec = (PaneRecord)findFirstRecordBySid(PaneRecord.sid);
-      if (rec == null)
-        return null;
-
-      return new PaneInformation(rec.getX(), rec.getY(), rec.getTopRow(),
-                                 rec.getLeftColumn(), (byte)rec.getActivePane(), windowTwo.getFreezePanes());
-    }
-
-    public SelectionRecord getSelection()
-    {
-        return selection;
-    }
-
-    public void setSelection( SelectionRecord selection )
-    {
-        this.selection = selection;
-    }
+    private static HeaderRecord createHeader() {
+        HeaderRecord retval = new HeaderRecord();
 
-    /**
-     * creates a Protect record with protect set to false.
-     */
-    private static ProtectRecord createProtect() {
-        if (log.check( POILogger.DEBUG )) {
-            log.log(POILogger.DEBUG, "create protect record with protection disabled");
-        }
-        ProtectRecord retval = new ProtectRecord(); 
-        retval.setProtect(false); // TODO - supply param to constructor
+        retval.setHeaderLength(( byte ) 0);
+        retval.setHeader(null);
         return retval;
     }
 
     /**
-     * creates an ObjectProtect record with protect set to false.
+     * creates the Footer Record and sets it to nothing/0 length
      */
-    private static ObjectProtectRecord createObjectProtect() {
-        if (log.check( POILogger.DEBUG ))
-            log.log(POILogger.DEBUG, "create protect record with protection disabled");
-        ObjectProtectRecord retval = new ObjectProtectRecord();
+    private static FooterRecord createFooter() {
+        FooterRecord retval = new FooterRecord();
 
-        retval.setProtect(false);
+        retval.setFooterLength(( byte ) 0);
+        retval.setFooter(null);
         return retval;
     }
 
     /**
-     * creates a ScenarioProtect record with protect set to false.
+     * creates the HCenter Record and sets it to false (don't horizontally center)
      */
-    private static ScenarioProtectRecord createScenarioProtect() {
-        if (log.check( POILogger.DEBUG ))
-            log.log(POILogger.DEBUG, "create protect record with protection disabled");
-        ScenarioProtectRecord retval = new ScenarioProtectRecord();
+    private static HCenterRecord createHCenter() {
+        HCenterRecord retval = new HCenterRecord();
 
-        retval.setProtect(false);
+        retval.setHCenter(false);
         return retval;
     }
 
-    /** Returns the ProtectRecord.
-     * If one is not contained in the sheet, then one is created.
-     */
-    public ProtectRecord getProtect()
-    {
-        if (protect == null) {
-            protect = createProtect();
-            // Insert the newly created protect record just before DefaultColWidthRecord
-            int loc = findFirstRecordLocBySid(DefaultColWidthRecord.sid);
-            records.add(loc, protect);
-        }
-        return protect;
-    }
-
-    /** Returns the PasswordRecord.
-     * If one is not contained in the sheet, then one is created.
-     */
-    public PasswordRecord getPassword()
-    {
-        if (password == null) {
-            password = createPassword();
-            //Insert the newly created password record at the end of the record (just before the EOF)
-            int loc = findFirstRecordLocBySid(EOFRecord.sid);
-            records.add(loc, password);
-        }
-        return password;
-    }
-
     /**
-     * creates a Password record with password set to 00.
-     */
-    private static PasswordRecord createPassword() {
-        if (log.check( POILogger.DEBUG )) {
-            log.log(POILogger.DEBUG, "create password record with 00 password");
-        }
-        PasswordRecord retval = new PasswordRecord();
+     * creates the VCenter Record and sets it to false (don't horizontally center)
+    */
+    private static VCenterRecord createVCenter() {
+        VCenterRecord retval = new VCenterRecord();
 
-        retval.setPassword((short)00);
+        retval.setVCenter(false);
         return retval;
     }
 
     /**
-
-    /**
-     * Sets whether the gridlines are shown in a viewer.
-     * @param show whether to show gridlines or not
-     */
-    public void setDisplayGridlines(boolean show) {
-        windowTwo.setDisplayGridlines(show);
-    }
-
-    /**
-     * Returns if gridlines are displayed.
-     * @return whether gridlines are displayed
+     * creates the PrintSetup Record and sets it to defaults and marks it invalid
+     * @see org.apache.poi.hssf.record.PrintSetupRecord
+     * @see org.apache.poi.hssf.record.Record
+     * @return record containing a PrintSetupRecord
      */
-    public boolean isDisplayGridlines() {
-    return windowTwo.getDisplayGridlines();
-    }
+    private static PrintSetupRecord createPrintSetup() {
+        PrintSetupRecord retval = new PrintSetupRecord();
 
-    /**
-     * Sets whether the formulas are shown in a viewer.
-     * @param show whether to show formulas or not
-     */
-    public void setDisplayFormulas(boolean show) {
-        windowTwo.setDisplayFormulas(show);
+        retval.setPaperSize(( short ) 1);
+        retval.setScale(( short ) 100);
+        retval.setPageStart(( short ) 1);
+        retval.setFitWidth(( short ) 1);
+        retval.setFitHeight(( short ) 1);
+        retval.setOptions(( short ) 2);
+        retval.setHResolution(( short ) 300);
+        retval.setVResolution(( short ) 300);
+        retval.setHeaderMargin( 0.5);
+        retval.setFooterMargin( 0.5);
+        retval.setCopies(( short ) 0);
+        return retval;
     }
-
+    
+    
     /**
-     * Returns if formulas are displayed.
-     * @return whether formulas are displayed
+     * Returns the HeaderRecord.
+     * @return HeaderRecord for the sheet.
      */
-    public boolean isDisplayFormulas() {
-    return windowTwo.getDisplayFormulas();
+    public HeaderRecord getHeader ()
+    {
+    return header;
     }
 
     /**
-     * Sets whether the RowColHeadings are shown in a viewer.
-     * @param show whether to show RowColHeadings or not
+     * Sets the HeaderRecord.
+     * @param newHeader The new HeaderRecord for the sheet.
      */
-    public void setDisplayRowColHeadings(boolean show) {
-        windowTwo.setDisplayRowColHeadings(show);
+    public void setHeader (HeaderRecord newHeader)
+    {
+        header = newHeader;
     }
 
     /**
-     * Returns if RowColHeadings are displayed.
-     * @return whether RowColHeadings are displayed
+     * Returns the FooterRecord.
+     * @return FooterRecord for the sheet.
      */
-    public boolean isDisplayRowColHeadings() {
-        return windowTwo.getDisplayRowColHeadings();
+    public FooterRecord getFooter ()
+    {
+        return footer;
     }
 
-
-    /**
-     * @return whether an uncalced record must be inserted or not at generation
-     */
-    public boolean getUncalced() {
-        return _isUncalced;
-    }
     /**
-     * @param uncalced whether an uncalced record must be inserted or not at generation
+     * Sets the FooterRecord.
+     * @param newFooter The new FooterRecord for the sheet.
      */
-    public void setUncalced(boolean uncalced) {
-        this._isUncalced = uncalced;
+    public void setFooter (FooterRecord newFooter)
+    {
+        footer = newFooter;
     }
 
     /**
-     * Returns the array of margins.  If not created, will create.
-     *
-     * @return the array of marings.
+     * Returns the PrintSetupRecord.
+     * @return PrintSetupRecord for the sheet.
      */
-    protected Margin[] getMargins() {
-        if (margins == null)
-            margins = new Margin[4];
-        return margins;
+    public PrintSetupRecord getPrintSetup ()
+    {
+        return printSetup;
     }
 
     /**
-     * Finds the DrawingRecord for our sheet, and
-     *  attaches it to the DrawingManager (which knows about
-     *  the overall DrawingGroup for our workbook).
-     * If requested, will create a new DrawRecord
-     *  if none currently exist
-     * @param drawingManager The DrawingManager2 for our workbook
-     * @param createIfMissing Should one be created if missing?
+     * Sets the PrintSetupRecord.
+     * @param newPrintSetup The new PrintSetupRecord for the sheet.
      */
-    public int aggregateDrawingRecords(DrawingManager2 drawingManager, boolean createIfMissing)
+    public void setPrintSetup (PrintSetupRecord newPrintSetup)
     {
-        int loc = findFirstRecordLocBySid(DrawingRecord.sid);
-        boolean noDrawingRecordsFound = (loc == -1);
-        if (noDrawingRecordsFound)
-        {
-            if(!createIfMissing) {
-                // None found, and not allowed to add in
-                return -1;
-            }
-
-            EscherAggregate aggregate = new EscherAggregate( drawingManager );
-            loc = findFirstRecordLocBySid(EscherAggregate.sid);
-            if (loc == -1)
-            {
-                loc = findFirstRecordLocBySid( WindowTwoRecord.sid );
-            }
-            else
-            {
-                getRecords().remove(loc);
-            }
-            getRecords().add( loc, aggregate );
-            return loc;
-        }
-        else
-        {
-            List records = getRecords();
-            EscherAggregate r = EscherAggregate.createAggregate( records, loc, drawingManager );
-            int startloc = loc;
-            while ( loc + 1 < records.size()
-                    && records.get( loc ) instanceof DrawingRecord
-                    && records.get( loc + 1 ) instanceof ObjRecord )
-            {
-                loc += 2;
-            }
-            int endloc = loc-1;
-            for(int i = 0; i < (endloc - startloc + 1); i++)
-                records.remove(startloc);
-            records.add(startloc, r);
-
-            return startloc;
-        }
+        printSetup = newPrintSetup;
     }
 
-    /**
-     * Perform any work necessary before the sheet is about to be serialized.
-     * For instance the escher aggregates size needs to be calculated before
-     * serialization so that the dgg record (which occurs first) can be written.
-     */
-    public void preSerialize()
-    {
-        for ( Iterator iterator = getRecords().iterator(); iterator.hasNext(); )
-        {
-            RecordBase r = (RecordBase) iterator.next();
-            if (r instanceof EscherAggregate)
-                r.getRecordSize();   // Trigger flatterning of user model and corresponding update of dgg record.
+    
+    private Margin getMarginRec(int marginIndex) {
+        switch (marginIndex) {
+            case Sheet.LeftMargin:   return _leftMargin;
+            case Sheet.RightMargin:  return _rightMargin;
+            case Sheet.TopMargin:    return _topMargin;
+            case Sheet.BottomMargin: return _bottomMargin;
         }
+        throw new RuntimeException( "Unknown margin constant:  " + marginIndex );
     }
+    
 
     /**
+     * Gets the size of the margin in inches.
+     * @param margin which margin to get
+     * @return the size of the margin
+     */
+   public double getMargin(short margin) {
+	   Margin m = getMarginRec(margin);
+	   if (m != null) {
+		return m.getMargin();
+	} else {
+       switch ( margin )
+       {
+       case Sheet.LeftMargin:
+           return .75;
+       case Sheet.RightMargin:
+           return .75;
+       case Sheet.TopMargin:
+           return 1.0;
+       case Sheet.BottomMargin:
+           return 1.0;
+       }
+        throw new RuntimeException( "Unknown margin constant:  " + margin );
+   }
+   }
+    
+    /**
+     * Sets the size of the margin in inches.
+     * @param margin which margin to get
+     * @param size the size of the margin
+     */
+   public void setMargin(short margin, double size) {
+   Margin m = getMarginRec(margin);
+   if (m  == null) {
+       switch ( margin )
+       {
+       case Sheet.LeftMargin:
+           _leftMargin = new LeftMarginRecord();
+           m = _leftMargin;
+           break;
+       case Sheet.RightMargin:
+           _rightMargin = new RightMarginRecord();
+           m = _rightMargin;
+           break;
+       case Sheet.TopMargin:
+           _topMargin = new TopMarginRecord();
+           m = _topMargin;
+           break;
+       case Sheet.BottomMargin:
+           _bottomMargin = new BottomMarginRecord();
+           m = _bottomMargin;
+           break;
+       default :
+           throw new RuntimeException( "Unknown margin constant:  " + margin );
+       }
+   }
+   m.setMargin( size );
+   }
+    
+    /**
      * Shifts all the page breaks in the range "count" number of rows/columns
      * @param breaks The page record to be shifted
      * @param start Starting "main" value to shift breaks
@@ -2054,24 +428,6 @@
             breaks.addBreak((short)(breakItem.main+count), breakItem.subFrom, breakItem.subTo);
         }
     }
-
-    private PageBreakRecord getRowBreaksRecord() {
-        if (_rowBreaksRecord == null) {
-            _rowBreaksRecord = new HorizontalPageBreakRecord();
-            RecordOrderer.addNewSheetRecord(records, _rowBreaksRecord);
-            dimsloc++;
-        }
-        return _rowBreaksRecord;
-    }
-    
-    private PageBreakRecord getColumnBreaksRecord() {
-        if (_columnBreaksRecord == null) {
-            _columnBreaksRecord = new VerticalPageBreakRecord();
-            RecordOrderer.addNewSheetRecord(records, _columnBreaksRecord);
-            dimsloc++;
-        }
-        return _columnBreaksRecord;
-    }
     
     
     /**
@@ -2087,7 +443,7 @@
      * @param row
      */
     public void removeRowBreak(int row) {
-        if (getRowBreaks() == null)
+        if (getRowBreaksRecord().getBreaks().length < 1)
             throw new IllegalArgumentException("Sheet does not define any row breaks");
         getRowBreaksRecord().removeBreak((short)row);
     }
@@ -2101,21 +457,6 @@
         return getRowBreaksRecord().getBreak(row) != null;
     }
 
-    /**
-     * Sets a page break at the indicated column
-     *
-     */
-    public void setColumnBreak(short column, short fromRow, short toRow) {
-        getColumnBreaksRecord().addBreak(column, fromRow, toRow);
-    }
-
-    /**
-     * Removes a page break at the indicated column
-     *
-     */
-    public void removeColumnBreak(short column) {
-        getColumnBreaksRecord().removeBreak(column);
-    }
 
     /**
      * Queries if the specified column has a page break
@@ -2174,136 +515,12 @@
         return getColumnBreaksRecord().getNumBreaks();
     }
 
-    public void setColumnGroupCollapsed( short columnNumber, boolean collapsed )
-    {
-        if (collapsed)
-        {
-            _columnInfos.collapseColumn( columnNumber );
-        }
-        else
-        {
-            _columnInfos.expandColumn( columnNumber );
-        }
-    }
-
-    /**
-     * protect a spreadsheet with a password (not encypted, just sets protect
-     * flags and the password.
-     * @param password to set
-     * @param objects are protected
-     * @param scenarios are protected
-     */
-    public void protectSheet( String password, boolean objects, boolean scenarios ) {
-        int protIdx = -1;
-        ProtectRecord prec = getProtect();
-        PasswordRecord pass = getPassword();
-        prec.setProtect(true);
-        pass.setPassword(PasswordRecord.hashPassword(password));
-        if((objprotect == null && objects) || (scenprotect != null && scenarios)) {
-            protIdx = records.indexOf( protect );
-        }
-        if(objprotect == null && objects) {
-            ObjectProtectRecord rec = createObjectProtect();
-            rec.setProtect(true);
-            records.add(protIdx+1,rec);
-            objprotect = rec;
-        }
-        if(scenprotect == null && scenarios) {
-            ScenarioProtectRecord srec = createScenarioProtect();
-            srec.setProtect(true);
-            records.add(protIdx+2,srec);
-            scenprotect = srec;
-        }
-    }
-
-    /**
-     * unprotect objects in the sheet (will not protect them, but any set to false are
-     * unprotected.
-     * @param sheet is unprotected (false = unprotect)
-     * @param objects are unprotected (false = unprotect)
-     * @param scenarios are unprotected (false = unprotect)
-     */
-    public void unprotectSheet( boolean sheet, boolean objects, boolean scenarios ) {
-
-        if (!sheet) {
-           ProtectRecord prec = getProtect();
-           prec.setProtect(sheet);
-           PasswordRecord pass = getPassword();
-           pass.setPassword((short)00);
-        }
-        if(objprotect != null && !objects) {
-            objprotect.setProtect(false);
-        }
-        if(scenprotect != null && !scenarios) {
-            scenprotect.setProtect(false);
-        }
-    }
-
-    /**
-     * @return {sheet is protected, objects are proteced, scenarios are protected}
-     */
-    public boolean[] isProtected() {
-        return new boolean[] { (protect != null && protect.getProtect()),
-                             (objprotect != null && objprotect.getProtect()),
-                             (scenprotect != null && scenprotect.getProtect())};
-    }
-
-
-    public void groupRowRange(int fromRow, int toRow, boolean indent)
-    {
-        checkRows();
-        for (int rowNum = fromRow; rowNum <= toRow; rowNum++)
-        {
-            RowRecord row = getRow( rowNum );
-            if (row == null)
-            {
-                row = createRow( rowNum );
-                addRow( row );
-            }
-            int level = row.getOutlineLevel();
-            if (indent) level++; else level--;
-            level = Math.max(0, level);
-            level = Math.min(7, level);
-            row.setOutlineLevel((short) ( level ));
-        }
-
-        recalcRowGutter();
-    }
-
-    private void recalcRowGutter()
-    {
-        int maxLevel = 0;
-        Iterator iterator = _rowsAggregate.getIterator();
-        while ( iterator.hasNext() )
-        {
-            RowRecord rowRecord = (RowRecord) iterator.next();
-            maxLevel = Math.max(rowRecord.getOutlineLevel(), maxLevel);
-        }
-
-        // Grab the guts record, adding if needed
-        GutsRecord guts = getGutsRecord();
-        // Set the levels onto it
-        guts.setRowLevelMax( (short) ( maxLevel + 1 ) );
-        guts.setLeftRowGutter( (short) ( 29 + (12 * (maxLevel)) ) );
-    }
-
-    public void setRowGroupCollapsed( int row, boolean collapse )
-    {
-        if (collapse)
-        {
-            _rowsAggregate.collapseRow( row );
-        }
-        else
-        {
-            _rowsAggregate.expandRow( row );
-        }
-    }
-    public DataValidityTable getOrCreateDataValidityTable() {
-        if (_dataValidityTable == null) {
-            DataValidityTable result = new DataValidityTable();
-            RecordOrderer.addNewSheetRecord(records, result);
-            _dataValidityTable = result;
-        }
-        return _dataValidityTable;
-    }
+	public VCenterRecord getVCenter() {
+		return _vCenter;
+	}
+
+	public HCenterRecord getHCenter() {
+		return _hCenter;
+	}
+	
 }

Propchange: poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/PageSettingsBlock.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/PageSettingsBlock.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/PageSettingsBlock.java
------------------------------------------------------------------------------
    svn:mergeinfo = 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org


Mime
View raw message