You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by je...@apache.org on 2005/05/13 16:28:45 UTC

cvs commit: xml-fop/src/java/org/apache/fop/layoutmgr ElementListUtils.java

jeremias    2005/05/13 07:28:45

  Modified:    src/java/org/apache/fop/layoutmgr/table Tag:
                        Temp_KnuthStylePageBreaking TableStepper.java
                        TableContentLayoutManager.java EffRow.java
  Added:       src/java/org/apache/fop/layoutmgr Tag:
                        Temp_KnuthStylePageBreaking ElementListUtils.java
  Log:
  Improved handling of explicit height/block-progression-dimension on table-cell and table-row. May not yet be perfect, though.
  Some helper methods moved to a utility class: ElementListUtils.
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.1.2.4   +16 -6     xml-fop/src/java/org/apache/fop/layoutmgr/table/Attic/TableStepper.java
  
  Index: TableStepper.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/table/Attic/TableStepper.java,v
  retrieving revision 1.1.2.3
  retrieving revision 1.1.2.4
  diff -u -r1.1.2.3 -r1.1.2.4
  --- TableStepper.java	12 May 2005 14:13:45 -0000	1.1.2.3
  +++ TableStepper.java	13 May 2005 14:28:45 -0000	1.1.2.4
  @@ -25,6 +25,7 @@
   import org.apache.commons.logging.Log;
   import org.apache.commons.logging.LogFactory;
   import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
  +import org.apache.fop.layoutmgr.ElementListUtils;
   import org.apache.fop.layoutmgr.KnuthBox;
   import org.apache.fop.layoutmgr.KnuthElement;
   import org.apache.fop.layoutmgr.KnuthPenalty;
  @@ -127,13 +128,22 @@
   
       private void setupElementList(int column) {
           GridUnit gu = getActiveGridUnit(column);
  +        EffRow row = getActiveRow();
           if (gu.isPrimary() && !gu.isEmpty()) {
               PrimaryGridUnit pgu = (PrimaryGridUnit)gu;
  -            if (pgu.hasBPD()) {
  -                List list = new java.util.ArrayList(1);
  -                list.add(new KnuthBoxCellWithBPD(
  -                        pgu.getEffectiveContentLength(), pgu));
  -                elementLists[column] = list;
  +            if (row.getExplicitHeight().min > 0) {
  +                boolean contentsSmaller = ElementListUtils.removeLegalBreaks(
  +                        pgu.getElements(), row.getExplicitHeight());
  +                if (contentsSmaller) {
  +                    List list = new java.util.ArrayList(1);
  +                    list.add(new KnuthBoxCellWithBPD(
  +                            row.getExplicitHeight().opt, pgu));
  +                    elementLists[column] = list;
  +                } else {
  +                    //Copy elements (LinkedList) to array lists to improve 
  +                    //element access performance
  +                    elementLists[column] = new java.util.ArrayList(pgu.getElements());
  +                }
               } else {
                   //Copy elements (LinkedList) to array lists to improve 
                   //element access performance
  
  
  
  1.1.2.15  +28 -67    xml-fop/src/java/org/apache/fop/layoutmgr/table/Attic/TableContentLayoutManager.java
  
  Index: TableContentLayoutManager.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/table/Attic/TableContentLayoutManager.java,v
  retrieving revision 1.1.2.14
  retrieving revision 1.1.2.15
  diff -u -r1.1.2.14 -r1.1.2.15
  --- TableContentLayoutManager.java	13 May 2005 07:07:53 -0000	1.1.2.14
  +++ TableContentLayoutManager.java	13 May 2005 14:28:45 -0000	1.1.2.15
  @@ -33,6 +33,7 @@
   import org.apache.fop.fo.flow.TableRow;
   import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
   import org.apache.fop.fo.properties.LengthRangeProperty;
  +import org.apache.fop.layoutmgr.ElementListUtils;
   import org.apache.fop.layoutmgr.KnuthBox;
   import org.apache.fop.layoutmgr.KnuthElement;
   import org.apache.fop.layoutmgr.KnuthPenalty;
  @@ -133,8 +134,8 @@
           if (headerIter != null) {
               this.headerList = getKnuthElementsForRowIterator(
                       headerIter, context, alignment, TableRowIterator.HEADER);
  -            removeLegalBreaks(this.headerList);
  -            this.headerNetHeight = calcCellHeightFromContents(this.headerList);
  +            ElementListUtils.removeLegalBreaks(this.headerList);
  +            this.headerNetHeight = ElementListUtils.calcContentLength(this.headerList);
               if (log.isDebugEnabled()) {
                   log.debug("==> Header: " + headerNetHeight + " - " + this.headerList);
               }
  @@ -153,8 +154,8 @@
           if (footerIter != null) {
               this.footerList = getKnuthElementsForRowIterator(
                       footerIter, context, alignment, TableRowIterator.FOOTER);
  -            removeLegalBreaks(this.footerList);
  -            this.footerNetHeight = calcCellHeightFromContents(this.footerList);
  +            ElementListUtils.removeLegalBreaks(this.footerList);
  +            this.footerNetHeight = ElementListUtils.calcContentLength(this.footerList);
               if (log.isDebugEnabled()) {
                   log.debug("==> Footer: " + footerNetHeight + " - " + this.footerList);
               }
  @@ -180,28 +181,6 @@
           return returnList;
       }
       
  -    private void removeLegalBreaks(LinkedList elements) {
  -        ListIterator i = elements.listIterator();
  -        while (i.hasNext()) {
  -            KnuthElement el = (KnuthElement)i.next();
  -            if (el.isPenalty()) {
  -                KnuthPenalty penalty = (KnuthPenalty)el;
  -                //Convert all penalties no break inhibitors
  -                if (penalty.getP() < KnuthPenalty.INFINITE) {
  -                    i.set(new KnuthPenalty(penalty.getW(), KnuthPenalty.INFINITE, 
  -                            penalty.isFlagged(), penalty.getPosition(), penalty.isAuxiliary()));
  -                }
  -            } else if (el.isGlue()) {
  -                i.previous();
  -                if (el.isBox()) {
  -                    i.next();
  -                    i.add(new KnuthPenalty(0, KnuthPenalty.INFINITE, false, 
  -                            new Position(getTableLM()), false));
  -                }
  -            }
  -        }
  -    }
  -    
       /**
        * Creates Knuth elements by iterating over a TableRowIterator.
        * @param iter TableRowIterator instance to fetch rows from
  @@ -351,12 +330,14 @@
               EffRow[] rowGroup) {
           log.debug("Handling row group with " + rowGroup.length + " rows...");
           MinOptMax[] rowHeights = new MinOptMax[rowGroup.length];
  +        MinOptMax[] explicitRowHeights = new MinOptMax[rowGroup.length];
           EffRow row;
           int maxColumnCount = 0;
           List pgus = new java.util.ArrayList(); //holds a list of a row's primary grid units
           for (int rgi = 0; rgi < rowGroup.length; rgi++) {
               row = rowGroup[rgi];
               rowHeights[rgi] = new MinOptMax(0, 0, Integer.MAX_VALUE);
  +            explicitRowHeights[rgi] = new MinOptMax(0, 0, Integer.MAX_VALUE);
               
               pgus.clear();
               TableRow tableRow = null;
  @@ -382,6 +363,8 @@
                                   minContentHeight = Math.max(minContentHeight, 
                                           bpd.getMinimum().getLength().getValue());
                               }
  +                            MinOptMaxUtil.restrict(explicitRowHeights[rgi], bpd);
  +                            
                           }
   
                           //Calculate width of cell
  @@ -404,7 +387,8 @@
   
                       
                       //Calculate height of cell contents
  -                    primary.setContentLength(calcCellHeightFromContents(primary.getElements()));
  +                    primary.setContentLength(ElementListUtils.calcContentLength(
  +                            primary.getElements()));
                       maxCellHeight = Math.max(maxCellHeight, primary.getContentLength());
   
                       //Calculate height of row, see CSS21, 17.5.3 Table height algorithms
  @@ -415,6 +399,10 @@
                               effCellContentHeight = Math.max(effCellContentHeight,
                                       bpd.getMinimum().getLength().getValue());
                           }
  +                        if (gu.getRowSpanIndex() == 0) {
  +                            //TODO ATM only non-row-spanned cells are taken for this
  +                            MinOptMaxUtil.restrict(explicitRowHeights[rgi], bpd);
  +                        }
                           effCellContentHeight = Math.max(effCellContentHeight, 
                                   primary.getContentLength());
                           int borderWidths;
  @@ -445,23 +433,19 @@
                       }
                   }
               }
  -            
  -            log.debug("row: " + row);
  -            
  -            PrimaryGridUnit[] pguArray = new PrimaryGridUnit[pgus.size()];
  -            pguArray = (PrimaryGridUnit[])pgus.toArray(pguArray);
   
  -            /*
  -            LinkedList returnedList = getCombinedKnuthElementsForRow(pguArray, row, 
  -                    isHeaderFooter);
  -            if (returnedList != null) {
  -                returnList.addAll(returnedList);
  -            }*/
  +            row.setExplicitHeight(explicitRowHeights[rgi]);
  +            if (row.getHeight().opt > row.getExplicitHeight().max) {
  +                log.warn("Contents of row " + row.getIndex() + " violate a maximum constraint "
  +                        + "in block-progression-dimension. Due to its contents the row grows "
  +                        + "to " + row.getHeight().opt + " millipoints. The row constraint resolve "
  +                        + "to " + row.getExplicitHeight());
  +            }
           }
           if (log.isDebugEnabled()) {
               log.debug("rowGroup:");
               for (int i = 0; i < rowHeights.length; i++) {
  -                log.debug("  " + rowHeights[i]);
  +                log.debug("  height=" + rowHeights[i] + " explicit=" + explicitRowHeights[i]);
               }
           }
           TableStepper stepper = new TableStepper(this);
  @@ -473,32 +457,6 @@
           
       }
   
  -    private int calcCellHeightFromContents(List elems, int start, int end) {
  -        ListIterator iter = elems.listIterator(start);
  -        int count = end - start + 1;
  -        int len = 0;
  -        while (iter.hasNext()) {
  -            KnuthElement el = (KnuthElement)iter.next();
  -            if (el.isBox()) {
  -                len += el.getW();
  -            } else if (el.isGlue()) {
  -                len += el.getW();
  -            } else {
  -                //log.debug("Ignoring penalty: " + el);
  -                //ignore penalties
  -            }
  -            count--;
  -            if (count == 0) {
  -                break;
  -            }
  -        }
  -        return len;
  -    }
  -    
  -    private int calcCellHeightFromContents(List elems) {
  -        return calcCellHeightFromContents(elems, 0, elems.size() - 1);
  -    }
  -    
       protected int getXOffsetOfGridUnit(GridUnit gu) {
           int col = gu.getStartCol();
           return startXOffset + getTableLM().getColumns().getXOffset(col + 1);
  @@ -676,8 +634,11 @@
                       log.debug("getting len for " + i + " " 
                               + start[i] + "-" + end[i]);
                       readyCount++;
  -                    int len = calcCellHeightFromContents(
  +                    int len = ElementListUtils.calcContentLength(
                               gridUnits[i].getElements(), start[i], end[i]);
  +                    if (start[i] == 0 && lastRow.getExplicitHeight().min > 0) {
  +                        len = Math.max(len, lastRow.getExplicitHeight().opt);
  +                    }
                       partLength[i] = len;
                       log.debug("len of part: " + len);
                       
  
  
  
  1.1.2.4   +14 -4     xml-fop/src/java/org/apache/fop/layoutmgr/table/Attic/EffRow.java
  
  Index: EffRow.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/table/Attic/EffRow.java,v
  retrieving revision 1.1.2.3
  retrieving revision 1.1.2.4
  diff -u -r1.1.2.3 -r1.1.2.4
  --- EffRow.java	13 May 2005 07:07:53 -0000	1.1.2.3
  +++ EffRow.java	13 May 2005 14:28:45 -0000	1.1.2.4
  @@ -32,7 +32,8 @@
       private List gridUnits = new java.util.ArrayList();
       private int index;
       private int bodyType;
  -    private MinOptMax height = new MinOptMax(0);
  +    private MinOptMax height;
  +    private MinOptMax explicitHeight;
       
       public EffRow(int index, int bodyType) {
           this.index = index;
  @@ -52,8 +53,16 @@
           return this.height;
       }
       
  -    public void setHeight(MinOptMax height) {
  -        this.height = height;
  +    public void setHeight(MinOptMax mom) {
  +        this.height = mom;
  +    }
  +    
  +    public MinOptMax getExplicitHeight() {
  +        return this.explicitHeight;
  +    }
  +    
  +    public void setExplicitHeight(MinOptMax mom) {
  +        this.explicitHeight = mom;
       }
       
       public List getGridUnits() {
  @@ -104,6 +113,7 @@
               sb.append(" in footer");
           }
           sb.append(", ").append(height);
  +        sb.append(", ").append(explicitHeight);
           sb.append(", ").append(gridUnits.size()).append(" gu");
           sb.append("}");
           return sb.toString();
  
  
  
  No                   revision
  No                   revision
  1.1.2.1   +136 -0    xml-fop/src/java/org/apache/fop/layoutmgr/Attic/ElementListUtils.java
  
  
  
  

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