klease      01/07/05 13:05:50

  Added:       src/org/apache/fop/fo/flow RowSpanMgr.java
  Log:
  Helper class for spanning rows
  
  Revision  Changes    Path
  1.1                  xml-fop/src/org/apache/fop/fo/flow/RowSpanMgr.java
  
  Index: RowSpanMgr.java
  ===================================================================
  /*-- $Id: RowSpanMgr.java,v 1.1 2001/07/05 20:05:49 klease Exp $ --
   * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
   * For details on use and redistribution please refer to the
   * LICENSE file included with these sources.
   */
  
  package org.apache.fop.fo.flow;
  
  import org.apache.fop.layout.Area;
  import java.util.Enumeration;
  
  public class RowSpanMgr {
      class SpanInfo {
        int cellHeight;
        int totalRowHeight;
        int rowsRemaining;
        //int numCols; // both V and H span
        TableCell cell;
          
        SpanInfo(TableCell cell, int cellHeight, int rowsSpanned) {
            this.cell = cell;
            this.cellHeight = cellHeight;
            this.totalRowHeight = 0;
            this.rowsRemaining = rowsSpanned;
        }
  
        /**
         * Return the height remaining in the span.
         */
        int heightRemaining() {
            int hl = cellHeight - totalRowHeight;
            return (hl>0)? hl : 0;
        }
  
        boolean isInLastRow() {
            return (rowsRemaining == 1);
        }
  
        boolean finishRow(int rowHeight) {
            totalRowHeight += rowHeight;
            if (--rowsRemaining == 0) {
                if (cell != null) {
                    cell.setRowHeight(totalRowHeight);
                }
                return true;
            }
            else return false;
        }
      }
  
      private SpanInfo spanInfo[];
  
      public RowSpanMgr(int numCols) {
        this.spanInfo = new SpanInfo[numCols];
      }
  
      public void addRowSpan(TableCell cell, int firstCol, int numCols,
                         int cellHeight, int rowsSpanned) {
        spanInfo[firstCol-1] = new SpanInfo(cell, cellHeight, rowsSpanned);
        for (int i=0; i <numCols-1; i++) {
            spanInfo[firstCol+i] =
                new SpanInfo(null, cellHeight, rowsSpanned); // copy!
        }
      }
  
      public boolean isSpanned(int colNum) {
        return (spanInfo[colNum-1] != null);
      }
  
  
      public TableCell getSpanningCell(int colNum) {
        if (spanInfo[colNum-1] != null) {
            return spanInfo[colNum-1].cell;
        }
        else return null;
      }
  
  
      /** Return true if any column has an unfinished vertical span.
       */
      public boolean hasUnfinishedSpans() {
        for (int i=0; i < spanInfo.length; i++) {
            if (spanInfo[i] != null)
                return true;
        }
        return false;
      }
  
        /** Done with a row.
         * Any spans with only one row left are done
         * This means that we can now set the total height for this cell box
         * Loop over all cells with spans and find number of rows remaining
         * if rows remaining  = 1, set the height on the cell area and
         * then remove the cell from the list of spanned cells. For other
         * spans, add the rowHeight to the spanHeight.
         */
      public void finishRow(int rowHeight) {
        for (int i=0; i < spanInfo.length; i++) {
            if (spanInfo[i] != null &&
                spanInfo[i].finishRow(rowHeight))
                spanInfo[i] = null;
            }
        }
  
      /**
       * If the cell in this column is in the last row of its vertical
       * span, return the height left. If it's not in the last row, or if
       * the content height <= the content height of the previous rows
       * of the span, return 0.
       */
      public int getRemainingHeight(int colNum) {
          if (spanInfo[colNum-1] != null) {
            return spanInfo[colNum-1].heightRemaining();
        }
        else return 0;
      }
  
      public boolean isInLastRow(int colNum) {
          if (spanInfo[colNum-1] != null) {
            return spanInfo[colNum-1].isInLastRow();
        }
        else return false;
      }
  
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to