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 kl...@apache.org on 2001/10/14 22:43:32 UTC

cvs commit: xml-fop/src/org/apache/fop/fo/flow Table.java TableColumn.java

klease      01/10/14 13:43:32

  Modified:    src/org/apache/fop/fo/flow Table.java TableColumn.java
  Log:
  Implement proportional column widths
  
  Revision  Changes    Path
  1.39      +179 -14   xml-fop/src/org/apache/fop/fo/flow/Table.java
  
  Index: Table.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/flow/Table.java,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -u -r1.38 -r1.39
  --- Table.java	2001/09/20 21:01:18	1.38
  +++ Table.java	2001/10/14 20:43:32	1.39
  @@ -1,5 +1,5 @@
   /*
  - * -- $Id: Table.java,v 1.38 2001/09/20 21:01:18 klease Exp $ --
  + * -- $Id: Table.java,v 1.39 2001/10/14 20:43:32 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.
  @@ -32,12 +32,13 @@
           return new Table.Maker();
       }
   
  +    private static final int MINCOLWIDTH = 10000; // 10pt
       int breakBefore;
       int breakAfter;
       int spaceBefore;
       int spaceAfter;
       ColorType backgroundColor;
  -    int width;
  +    LengthRange ipd;
       int height;
       String id;
       TableHeader tableHeader = null;
  @@ -47,6 +48,14 @@
   
       Vector columns = new Vector();
       int bodyCount = 0;
  +    private boolean bAutoLayout=false;
  +    private int contentWidth = 0; // Sum of column widths
  +    /** Optimum inline-progression-dimension */
  +    private int optIPD;
  +    /** Minimum inline-progression-dimension */
  +    private int minIPD;
  +    /** Maximum inline-progression-dimension */
  +    private int maxIPD;
   
       AreaContainer areaContainer;
   
  @@ -106,8 +115,12 @@
                   this.properties.get("space-after.optimum").getLength().mvalue();
               this.backgroundColor =
                   this.properties.get("background-color").getColorType();
  -            this.width = this.properties.get("width").getLength().mvalue();
  +            this.ipd =
  +		this.properties.get("inline-progression-dimension").
  +		getLengthRange();
               this.height = this.properties.get("height").getLength().mvalue();
  +            this.bAutoLayout = (this.properties.get("table-layout").getEnum() == 
  +		TableLayout.AUTO);
   
               this.id = this.properties.get("id").getString();
   
  @@ -157,6 +170,7 @@
               new AreaContainer(propMgr.getFontState(area.getFontInfo()), 0, 0,
                                 area.getAllocationWidth(), area.spaceLeft(),
                                 Position.STATIC);
  +
           areaContainer.foCreator = this;    // G Seshadri
           areaContainer.setPage(area.getPage());
           areaContainer.setBackgroundColor(backgroundColor);
  @@ -170,13 +184,20 @@
           boolean addedFooter = false;
           int numChildren = this.children.size();
   
  -	// Set up the column vector
  +	// Set up the column vector;
  +	// calculate width of all columns and get total width
   	if (columns.size()==0) {
   	    findColumns(areaContainer);
  +	    if (this.bAutoLayout) {
  +		log.warn("table-layout=auto is not supported, using fixed!");
  +	    }
  +	    // Pretend it's fixed...
  +	    this.contentWidth = 
  +		calcFixedColumnWidths(areaContainer.getAllocationWidth());
   	}
  -	// Now layout all the columns and get total offset
  -        areaContainer.setAllocationWidth( layoutColumns(areaContainer));
  -
  +        areaContainer.setAllocationWidth(this.contentWidth);
  +        layoutColumns(areaContainer);
  +	
           for (int i = this.marker; i < numChildren; i++) {
               FONode fo = (FONode)children.elementAt(i);
               if (fo instanceof TableHeader) {
  @@ -367,28 +388,127 @@
               }
           }
       }
  +
   
  -    private int layoutColumns(Area areaContainer) throws FOPException  {
  -        int offset = 0;
  +
  +    private int calcFixedColumnWidths(int maxAllocationWidth) {
   	int nextColumnNumber=1;
  +	int iEmptyCols=0;
  +	double dTblUnits=0.0;
  +	int iFixedWidth=0;
  +	double dWidthFactor = 0.0;
  +	double dUnitLength = 0.0;
  +	double tuMin = 100000.0 ; // Minimum number of proportional units
   	Enumeration eCol = columns.elements();
   	while (eCol.hasMoreElements()) {
   	    TableColumn c = (TableColumn)eCol.nextElement();
   	    if (c == null) {
  -		log.warn("No table-column specified in column " +
  +		log.warn("No table-column specification for column " +
   			 nextColumnNumber);
  +		// What about sizing issues?
  +		iEmptyCols++;
   	    }
   	    else {
  -		//c.doSetup(areaContainer);
  -		c.setColumnOffset(offset);
  -		c.layout(areaContainer);
  -		offset += c.getColumnWidth();
  +                Length colLength = c.getColumnWidthAsLength();
  +		double tu = colLength.getTableUnits();
  +		if (tu > 0 && tu < tuMin && colLength.mvalue()==0) {
  +		    /* Keep track of minimum number of proportional units
  +		     * in any column which has only proportional units.
  +		     */
  +		    tuMin = tu;
  +		}
  +		dTblUnits += tu;
  +		iFixedWidth +=  colLength.mvalue();
   	    }
   	    nextColumnNumber++;
   	}
  +
  +	setIPD((dTblUnits > 0.0), maxAllocationWidth);
  +	if (dTblUnits > 0.0) {
  +	    int iProportionalWidth = 0;
  +	    if (this.optIPD > iFixedWidth) {
  +		iProportionalWidth = this.optIPD - iFixedWidth;
  +	    }
  +	    else if (this.maxIPD > iFixedWidth) {
  +		iProportionalWidth = this.maxIPD - iFixedWidth;
  +	    }
  +	    else {
  +		iProportionalWidth = maxAllocationWidth - iFixedWidth;
  +	    }
  +	    if (iProportionalWidth > 0) {
  +		dUnitLength = ((double)iProportionalWidth)/dTblUnits;
  +	    }
  +	    else {
  +		log.error("Sum of fixed column widths " + iFixedWidth +
  +			  " greater than maximum available IPD " +
  +			  maxAllocationWidth + "; no space for " +
  +			  dTblUnits + " proportional units.");
  +		/* Set remaining proportional units to a number which
  +		 * will assure the minimum column size for tuMin.
  +		 */
  +		dUnitLength = MINCOLWIDTH/tuMin;
  +		// Reduce fixed column widths by this much???
  +	    }
  +	    //log.debug("1 table-unit = " + dUnitLength + " mpt");
  +	}
  +	else {
  +	    /* No proportional units. If minimum IPD is specified, check
  +	     * that sum of column widths > minIPD.
  +	     */
  +	    int iTableWidth = iFixedWidth;
  +	    if (this.minIPD > iFixedWidth) {
  +		iTableWidth = this.minIPD;
  +		// Add extra space to each column
  +		dWidthFactor = (double)this.minIPD/(double)iFixedWidth;
  +	    }
  +	    else if (this.maxIPD < iFixedWidth) {
  +		// Note: if maxIPD=auto, use maxAllocWidth
  +		log.warn("Sum of fixed column widths " + iFixedWidth +
  +			 " greater than maximum specified IPD " + this.maxIPD);
  +	    }
  +	    else if (this.optIPD != -1 && iFixedWidth != this.optIPD) {
  +		log.warn("Sum of fixed column widths " + iFixedWidth +
  +			 " differs from specified optimum IPD " + this.optIPD);
  +	    }
  +	}
  +	// Now distribute the extra units onto each column and set offsets
  +	int offset = 0;
  +	eCol = columns.elements();
  +	while (eCol.hasMoreElements()) {
  +	    TableColumn c = (TableColumn)eCol.nextElement();
  +	    if (c != null) {
  +		c.setColumnOffset(offset);
  +		Length l = c.getColumnWidthAsLength();
  +		if (dUnitLength > 0) {
  +		    l.resolveTableUnit(dUnitLength);
  +		}
  +		// Check minimum values and adjust if necessary
  +		int colWidth = l.mvalue();
  +		if (colWidth <= 0) {
  +		    log.warn("Zero-width table column!");
  +		}
  +		if (dWidthFactor > 0.0) {
  +		    // Increase column sizes to use up extra space
  +		    colWidth *= dWidthFactor;
  +		}
  +		c.setColumnWidth(colWidth);
  +		offset += colWidth;
  +	    }
  +	}
   	return offset;
       }
   
  +    private void layoutColumns(Area tableArea) throws FOPException  {
  +	Enumeration eCol = columns.elements();
  +	while (eCol.hasMoreElements()) {
  +	    TableColumn c = (TableColumn)eCol.nextElement();
  +	    if (c != null) {
  +		c.layout(tableArea);
  +	    }
  +	}
  +    }
  +
  +
       public int getAreaHeight() {
           return areaContainer.getHeight();
       }
  @@ -402,6 +522,51 @@
           else
               return 0;    // not laid out yet
       }
  +
  +    /**
  +     * Initialize table inline-progression-properties values
  +     */
  +    private void setIPD(boolean bHasProportionalUnits, int maxAllocIPD) {
  +	boolean bMaxIsSpecified = !this.ipd.getMaximum().getLength().isAuto();
  +	if (bMaxIsSpecified) {
  +	    this.maxIPD = ipd.getMaximum().getLength().mvalue();
  +	}
  +	else {
  +	    this.maxIPD = maxAllocIPD;
  +	}
  +
  +	if (ipd.getOptimum().getLength().isAuto()) {
  +	    this.optIPD = -1;
  +	}
  +	else {
  +	    this.optIPD = ipd.getMaximum().getLength().mvalue();
  +	}
  +	if (ipd.getMinimum().getLength().isAuto()) {
  +	    this.minIPD = -1;
  +	}
  +	else {
  +	    this.minIPD = ipd.getMinimum().getLength().mvalue();
  +	}
  +	if (bHasProportionalUnits && this.optIPD < 0) {
  +	    if (this.minIPD > 0) {
  +		if (bMaxIsSpecified) {
  +		    this.optIPD = (minIPD + maxIPD)/2;
  +		}
  +		else {
  +		    this.optIPD = this.minIPD;
  +		}
  +	    }
  +	    else if (bMaxIsSpecified) {
  +		this.optIPD = this.maxIPD;
  +	    }
  +	    else {
  +		log.error("At least one of minimum, optimum, or maximum " +
  +			  "IPD must be specified on table.");
  +		this.optIPD = this.maxIPD;
  +	    }
  +	}
  +    }
  +
   
       // /**
       // * Return the last TableRow in the header or null if no header or
  
  
  
  1.20      +34 -20    xml-fop/src/org/apache/fop/fo/flow/TableColumn.java
  
  Index: TableColumn.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/flow/TableColumn.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- TableColumn.java	2001/09/20 20:29:22	1.19
  +++ TableColumn.java	2001/10/14 20:43:32	1.20
  @@ -1,5 +1,5 @@
   /*
  - * $Id: TableColumn.java,v 1.19 2001/09/20 20:29:22 klease Exp $
  + * $Id: TableColumn.java,v 1.20 2001/10/14 20:43:32 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.
  @@ -18,6 +18,7 @@
   
       ColorType backgroundColor;
   
  +    Length columnWidthPropVal;
       int columnWidth;
       int columnOffset;
       int numColumnsRepeated;
  @@ -44,10 +45,22 @@
           this.name = "fo:table-column";
       }
   
  +    public Length getColumnWidthAsLength() {
  +        return columnWidthPropVal;
  +    }
  +
       public int getColumnWidth() {
           return columnWidth;
       }
   
  +    /**
  +     * Set the column width value in base units which overrides the
  +     * value from the column-width Property.
  +     */
  +    public void setColumnWidth(int columnWidth) {
  +        this.columnWidth = columnWidth;
  +    }
  +
       public int getColumnNumber() {
           return iColumnNumber;
       }
  @@ -78,8 +91,10 @@
           this.backgroundColor =
               this.properties.get("background-color").getColorType();
   
  -        this.columnWidth =
  -            this.properties.get("column-width").getLength().mvalue();
  +        this.columnWidthPropVal =
  +            this.properties.get("column-width").getLength();
  +	// This won't include resolved table-units or % values yet.
  +	this.columnWidth = columnWidthPropVal.mvalue();
   
           // initialize id
           String id = this.properties.get("id").getString();
  @@ -98,21 +113,18 @@
                   doSetup(area);
               }
           }
  -
  -        // KL: don't take table borders into account!
  -        this.areaContainer =
  -            new AreaContainer(propMgr.getFontState(area.getFontInfo()),
  -                              columnOffset /* - area.getBorderLeftWidth() */,
  -                              /* -area.getBorderTopWidth() */
  -        0, columnWidth, area.getContentHeight(), Position.RELATIVE);
  -        // area.getHeight(), Position.RELATIVE);
  -        areaContainer.foCreator = this;    // G Seshadri
  -        areaContainer.setPage(area.getPage());
  -        areaContainer.setBorderAndPadding(propMgr.getBorderAndPadding());
  -        areaContainer.setBackgroundColor(this.backgroundColor);
  -        areaContainer.setHeight(area.getHeight());
  -        area.addChild(areaContainer);
  -
  +	if (columnWidth > 0) {
  +	    this.areaContainer =
  +		new AreaContainer(propMgr.getFontState(area.getFontInfo()),
  +				  columnOffset, 0, columnWidth,
  +				  area.getContentHeight(), Position.RELATIVE);
  +	    areaContainer.foCreator = this;    // G Seshadri
  +	    areaContainer.setPage(area.getPage());
  +	    areaContainer.setBorderAndPadding(propMgr.getBorderAndPadding());
  +	    areaContainer.setBackgroundColor(this.backgroundColor);
  +	    areaContainer.setHeight(area.getHeight());
  +	    area.addChild(areaContainer);
  +	}
           return new Status(Status.OK);
       }
   
  @@ -121,8 +133,10 @@
       }
   
       public void setHeight(int height) {
  -        areaContainer.setMaxHeight(height);
  -        areaContainer.setHeight(height);
  +	if (areaContainer != null) {
  +	    areaContainer.setMaxHeight(height);
  +	    areaContainer.setHeight(height);
  +	}
       }
   
   }
  
  
  

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