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 2002/05/10 14:38:16 UTC

cvs commit: xml-fop/src/org/apache/fop/layoutmgr InlineStackingBPLayoutManager.java LMiter.java AbstractBPLayoutManager.java BPLayoutManager.java BlockLayoutManager.java BreakPoss.java BreakPossPosIter.java LineBPLayoutManager.java LineLayoutManager.java SpaceSpecifier.java TextBPLayoutManager.java

klease      02/05/10 05:38:16

  Modified:    src/org/apache/fop/render AbstractRenderer.java
                        Renderer.java
               src/org/apache/fop/render/xml XMLRenderer.java
               src/org/apache/fop/layoutmgr AbstractBPLayoutManager.java
                        BPLayoutManager.java BlockLayoutManager.java
                        BreakPoss.java BreakPossPosIter.java
                        LineBPLayoutManager.java LineLayoutManager.java
                        SpaceSpecifier.java TextBPLayoutManager.java
  Added:       src/org/apache/fop/layoutmgr
                        InlineStackingBPLayoutManager.java LMiter.java
  Log:
  Add support for line-breaking in nested inlines using BreakPoss strategy
  
  Revision  Changes    Path
  1.15      +10 -3     xml-fop/src/org/apache/fop/render/AbstractRenderer.java
  
  Index: AbstractRenderer.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/render/AbstractRenderer.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- AbstractRenderer.java	11 Apr 2002 09:33:31 -0000	1.14
  +++ AbstractRenderer.java	10 May 2002 12:38:15 -0000	1.15
  @@ -1,5 +1,5 @@
   /*
  - * $Id: AbstractRenderer.java,v 1.14 2002/04/11 09:33:31 keiron Exp $
  + * $Id: AbstractRenderer.java,v 1.15 2002/05/10 12:38:15 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.
  @@ -10,10 +10,8 @@
   // FOP
   import org.apache.fop.apps.FOPException;
   import org.apache.fop.area.*;
  -import org.apache.fop.area.Span;
   import org.apache.fop.area.inline.*;
   import org.apache.fop.area.inline.Character;
  -import org.apache.fop.area.inline.Space;
   import org.apache.fop.fo.FOUserAgent;
   
   // Avalon
  @@ -25,6 +23,7 @@
   import java.io.OutputStream;
   import java.util.HashMap;
   import java.util.List;
  +import java.util.Iterator;
   
   /**
    * Abstract base class for all renderers.
  @@ -306,6 +305,14 @@
   
       public void renderWord(Word word) {
           currentBlockIPPosition += word.getWidth();
  +    }
  +
  +    public void renderInlineParent(InlineParent ip) {
  +        // currentBlockIPPosition += ip.getWidth();
  +	Iterator iter = ip.getChildAreas().iterator();
  +	while (iter.hasNext()) {
  +            ((InlineArea)iter.next()).render(this);
  +        }
       }
   
       protected void renderBlocks(List blocks) {
  
  
  
  1.25      +3 -1      xml-fop/src/org/apache/fop/render/Renderer.java
  
  Index: Renderer.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/render/Renderer.java,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- Renderer.java	11 Apr 2002 09:33:31 -0000	1.24
  +++ Renderer.java	10 May 2002 12:38:15 -0000	1.25
  @@ -1,5 +1,5 @@
   /*
  - * $Id: Renderer.java,v 1.24 2002/04/11 09:33:31 keiron Exp $
  + * $Id: Renderer.java,v 1.25 2002/05/10 12:38:15 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.
  @@ -74,6 +74,8 @@
       public void renderContainer(Container cont);
   
       public void renderWord(Word area);
  +
  +    public void renderInlineParent(InlineParent ip);
   
       public void renderCharacter(
                 org.apache.fop.area.inline.Character ch);
  
  
  
  1.37      +12 -1     xml-fop/src/org/apache/fop/render/xml/XMLRenderer.java
  
  Index: XMLRenderer.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/render/xml/XMLRenderer.java,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- XMLRenderer.java	11 Apr 2002 09:33:31 -0000	1.36
  +++ XMLRenderer.java	10 May 2002 12:38:15 -0000	1.37
  @@ -1,5 +1,5 @@
   /*
  - * $Id: XMLRenderer.java,v 1.36 2002/04/11 09:33:31 keiron Exp $
  + * $Id: XMLRenderer.java,v 1.37 2002/05/10 12:38:15 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.
  @@ -346,6 +346,17 @@
           }
           writeElement("<word" + prop + ">" + word.getWord() + "</word>");
           super.renderWord(word);
  +    }
  +
  +    public void renderInlineParent(InlineParent ip) {
  +        String prop = "";
  +        List list = ip.getTraitList();
  +        if (list != null) {
  +            prop = " props=\"" + getPropString(list) + "\"";
  +        }
  +        writeStartTag("<inlineparent" + prop + ">");
  +        super.renderInlineParent(ip);
  +	writeEndTag("</inlineparent>");
       }
   
       public void renderLeader(Leader area) {
  
  
  
  1.2       +72 -3     xml-fop/src/org/apache/fop/layoutmgr/AbstractBPLayoutManager.java
  
  Index: AbstractBPLayoutManager.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/layoutmgr/AbstractBPLayoutManager.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- AbstractBPLayoutManager.java	28 Apr 2002 21:31:00 -0000	1.1
  +++ AbstractBPLayoutManager.java	10 May 2002 12:38:15 -0000	1.2
  @@ -1,5 +1,5 @@
   /*
  - * $Id: AbstractBPLayoutManager.java,v 1.1 2002/04/28 21:31:00 klease Exp $
  + * $Id: AbstractBPLayoutManager.java,v 1.2 2002/05/10 12:38:15 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.
  @@ -24,10 +24,78 @@
   
       /** True if this LayoutManager has handled all of its content. */
       private boolean m_bFinished = false;
  +    private BPLayoutManager m_curChildLM=null;
  +    private ListIterator m_childLMiter;
  +    private boolean m_bInited=false;
   
   
       public AbstractBPLayoutManager(FObj fobj) {
  +	this(fobj, new LMiter(fobj.getChildren()));
  +    }
  +
  +
  +    public AbstractBPLayoutManager(FObj fobj, ListIterator lmIter) {
   	super(fobj);
  +	m_childLMiter = lmIter;
  +    }
  +
  +
  +    /**
  +     * Return currently active child LayoutManager or null if
  +     * all children have finished layout.
  +     * Note: child must implement BPLayoutManager! If it doesn't, skip it
  +     * and print a warning.
  +     */
  +    protected BPLayoutManager getChildLM() {
  +	if (m_curChildLM != null && !m_curChildLM.isFinished()) {
  +	    return m_curChildLM;
  +	}
  +	while (m_childLMiter.hasNext()) {
  +	    Object obj = m_childLMiter.next();
  +	    if (obj instanceof BPLayoutManager) {
  +		m_curChildLM = (BPLayoutManager)obj;
  +		m_curChildLM.setParentLM(this);
  +		m_curChildLM.init();
  +		return m_curChildLM;
  +	    }
  +	    else {
  +		m_childLMiter.remove();
  +		System.err.println("WARNING: child LM not a BPLayoutManager: "
  +				   + obj.getClass().getName());
  +	    }
  +	}
  +	return null;
  +    }
  +
  +
  +    /**
  +     * Reset the layoutmanager "iterator" so that it will start
  +     * with the passed bplm on the next call to getChildLM.
  +     * @param bplm Reset iterator to this LayoutManager.
  +     */
  +    protected void reset(LayoutManager lm, BreakPoss.Position pos) {
  + 	//if (lm == null) return;
  +	if (m_curChildLM != lm) {
  +	    // ASSERT m_curChildLM == (BPLayoutManager)m_childLMiter.previous()
  +	    if (m_curChildLM != (BPLayoutManager)m_childLMiter.previous()) {
  +		System.err.println("LMiter problem!");
  +	    }
  +	    while (m_curChildLM != lm && m_childLMiter.hasPrevious()) {
  +		m_curChildLM.resetPosition(null);
  +		m_curChildLM = (BPLayoutManager)m_childLMiter.previous();
  +	    }
  +	    m_childLMiter.next(); // Otherwise next returns same object
  +	}
  + 	m_curChildLM.resetPosition(pos);
  + 	if (isFinished()) {
  + 	    setFinished(false);
  + 	}
  +    }
  +
  +    public void resetPosition(BreakPoss.Position resetPos) {
  +	if (resetPos == null) {
  +	    reset(null, null);
  +	}
       }
   
   
  @@ -35,9 +103,10 @@
        * This method provides a hook for a LayoutManager to intialize traits
        * for the areas it will create, based on Properties set on its FO.
        */
  -    protected final void initProperties() {
  - 	if (fobj != null) {
  +    public void init() {
  + 	if (fobj != null && m_bInited == false) {
   	    initProperties(fobj.getPropertyManager());
  +	    m_bInited=true;
    	}
       }
   
  
  
  
  1.2       +5 -1      xml-fop/src/org/apache/fop/layoutmgr/BPLayoutManager.java
  
  Index: BPLayoutManager.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/layoutmgr/BPLayoutManager.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- BPLayoutManager.java	28 Apr 2002 21:31:00 -0000	1.1
  +++ BPLayoutManager.java	10 May 2002 12:38:15 -0000	1.2
  @@ -1,5 +1,5 @@
   /*
  - * $Id: BPLayoutManager.java,v 1.1 2002/04/28 21:31:00 klease Exp $
  + * $Id: BPLayoutManager.java,v 1.2 2002/05/10 12:38:15 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.
  @@ -63,5 +63,9 @@
        * Iterator.
        */
       public void addAreas(PositionIterator posIter) ;
  +
  +    public void init() ;
  +
  +    public void resetPosition(BreakPoss.Position position);
   
   }
  
  
  
  1.8       +3 -3      xml-fop/src/org/apache/fop/layoutmgr/BlockLayoutManager.java
  
  Index: BlockLayoutManager.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/layoutmgr/BlockLayoutManager.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- BlockLayoutManager.java	28 Apr 2002 21:28:01 -0000	1.7
  +++ BlockLayoutManager.java	10 May 2002 12:38:15 -0000	1.8
  @@ -1,5 +1,5 @@
   /*
  - * $Id: BlockLayoutManager.java,v 1.7 2002/04/28 21:28:01 klease Exp $
  + * $Id: BlockLayoutManager.java,v 1.8 2002/05/10 12:38:15 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.
  @@ -83,13 +83,13 @@
                           break;
                       }
                   }
  +		/*
                   lm = new LineLayoutManager(curFobj, inlines, lineHeight, lead,
                                              follow);
  +		*/
   		// !!!! To test BreakPoss Line LayoutManager, uncomment!
  -		/*
                   lm = new LineBPLayoutManager(curFobj, inlines, lineHeight,
   		                                lead, follow);
  -		*/
                   lms.set(count, lm);
               }
               lm.setParentLM(this);
  
  
  
  1.2       +6 -2      xml-fop/src/org/apache/fop/layoutmgr/BreakPoss.java
  
  Index: BreakPoss.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/layoutmgr/BreakPoss.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- BreakPoss.java	28 Apr 2002 21:31:00 -0000	1.1
  +++ BreakPoss.java	10 May 2002 12:38:15 -0000	1.2
  @@ -1,5 +1,5 @@
   /*
  - * $Id: BreakPoss.java,v 1.1 2002/04/28 21:31:00 klease Exp $
  + * $Id: BreakPoss.java,v 1.2 2002/05/10 12:38:15 klease Exp $
    * Copyright (C) 2002 The Apache Software Foundation. All rights reserved.
    * For details on use and redistribution please refer to the
    * LICENSE file included with these sources.
  @@ -84,7 +84,7 @@
   	this(lm,position,0);
       }
   
  -    public BreakPoss(BPLayoutManager lm, Position position, int flags) {
  +    public BreakPoss(BPLayoutManager lm, Position position, long flags) {
           m_lm = lm;
           m_position = position;
   	m_flags = flags;
  @@ -126,6 +126,10 @@
   
       public MinOptMax getNonStackingSize() {
   	return this.m_nonStackSize ;
  +    }
  +
  +    public long getFlags() {
  +	return m_flags;
       }
   
       public void setFlag(int flagBit) {
  
  
  
  1.2       +8 -2      xml-fop/src/org/apache/fop/layoutmgr/BreakPossPosIter.java
  
  Index: BreakPossPosIter.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/layoutmgr/BreakPossPosIter.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- BreakPossPosIter.java	28 Apr 2002 21:31:00 -0000	1.1
  +++ BreakPossPosIter.java	10 May 2002 12:38:15 -0000	1.2
  @@ -1,5 +1,5 @@
   /*
  - * $Id: BreakPossPosIter.java,v 1.1 2002/04/28 21:31:00 klease Exp $
  + * $Id: BreakPossPosIter.java,v 1.2 2002/05/10 12:38:15 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.
  @@ -21,7 +21,13 @@
       // Check position < endPos
   
       protected boolean checkNext() {
  -	return (m_iterCount > 0 && super.checkNext());
  +	if (m_iterCount > 0) {
  +	    return super.checkNext();
  +	}
  +	else {
  +	    endIter();
  +	    return false;
  +	}
       }
   
       public Object next() {
  
  
  
  1.2       +24 -85    xml-fop/src/org/apache/fop/layoutmgr/LineBPLayoutManager.java
  
  Index: LineBPLayoutManager.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/layoutmgr/LineBPLayoutManager.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- LineBPLayoutManager.java	28 Apr 2002 21:31:00 -0000	1.1
  +++ LineBPLayoutManager.java	10 May 2002 12:38:15 -0000	1.2
  @@ -1,5 +1,5 @@
   /*
  - * $Id: LineBPLayoutManager.java,v 1.1 2002/04/28 21:31:00 klease Exp $
  + * $Id: LineBPLayoutManager.java,v 1.2 2002/05/10 12:38:15 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.
  @@ -33,7 +33,8 @@
    * BPLayoutManager for lines. It builds one or more lines containing
    * inline areas generated by its sub layout managers.
    */
  -public class LineBPLayoutManager extends LineLayoutManager {
  +public class LineBPLayoutManager extends 
  +      InlineStackingBPLayoutManager {
   
       /**
        * Private class to store information about inline breaks.
  @@ -48,8 +49,6 @@
           }
       }
   
  -    private BPLayoutManager m_curChildLM=null;
  -    private ListIterator m_childLMiter;
   
       private LineArea m_lineArea; // LineArea currently being filled
   
  @@ -64,13 +63,13 @@
   
   
       public LineBPLayoutManager(FObj fobj, List lms, int lh, int l, int f) {
  -	super(fobj, lms, lh, l, f);
  -	m_childLMiter = lms.listIterator();
  -	initProperties();
  +	//super(fobj, lms, lh, l, f);
  +	super(fobj, lms.listIterator());
  +	// initProperties();
       }
   
       protected void initProperties(PropertyManager propMgr) {
  -	super.initProperties(propMgr);
  +	// super.initProperties(propMgr);
   	System.err.println("LineBPLayoutManager.initProperties called");
           MarginProps marginProps = propMgr.getMarginProps();
           m_iIndents = marginProps.startIndent + marginProps.endIndent;
  @@ -80,47 +79,6 @@
       }
       
   
  -    /**
  -     * Return next child LayoutManager or null if there is none.
  -     * Note: child must implement BPLayoutManager! If it doesn't, skip it
  -     * and print a warning.
  -     * The list of all child layout managers is in lmList (in superclass!)
  -     */
  -    private BPLayoutManager getChildLM() {
  -	if (m_curChildLM != null && !m_curChildLM.isFinished()) {
  -	    return m_curChildLM;
  -	}
  -	while (m_childLMiter.hasNext()) {
  -	    Object obj = m_childLMiter.next();
  -	    if (obj instanceof BPLayoutManager) {
  -		m_curChildLM = (BPLayoutManager)obj;
  -		m_curChildLM.setParentLM(this);
  -		return m_curChildLM;
  -	    }
  -	    else {
  -		m_childLMiter.remove();
  -		System.err.println("WARNING: child of LineLPLayoutManager not a BPLayoutManager: " + obj.getClass().getName());
  -	    }
  -	}
  -	return null;
  -    }
  -
  -    /**
  -     * Reset the layoutmanager "iterator" so that it will start
  -     * with the passed bplm on the next call to getChildLM.
  -     * @param bplm Reset iterator to this LayoutManager.
  -     */
  -    private void resetChildLM(BPLayoutManager bplm) {
  -	if (bplm == null) return;
  -	while (m_curChildLM != bplm && m_childLMiter.hasPrevious()) {
  -	    m_curChildLM = (BPLayoutManager)m_childLMiter.previous();
  -	}
  -	if ( m_curChildLM.isFinished()) {
  -	    m_curChildLM.setFinished(false);
  -	}
  -    }
  -
  -
   
       /**
        * Call child layout managers to generate content as long as they
  @@ -183,10 +141,7 @@
                   inlineLC.unsetFlags(LayoutContext.SUPPRESS_LEADING_SPACE);
               }
   	    // GET NEXT POSSIBLE BREAK FROM CHILD LM
  -            if ((bp = curLM.getNextBreakPoss(inlineLC,
  -					     (m_prevBP !=null ?
  -					      m_prevBP.getPosition() :
  -					      null))) != null) {
  +            if ((bp = curLM.getNextBreakPoss(inlineLC, null)) != null) {
   		// check if this bp fits in line
   		MinOptMax bpDim = (MinOptMax)bp.getStackingSize().clone();
   		/* If first BP for this LM (in this call)
  @@ -232,8 +187,12 @@
   			 * This includes any previosly pending size,
   			 * already calculated above.
   			 */
  -			pendingIPD = bpDim;
  -			// Add BP to the pending list
  +			if (bp.isLastArea()) {
  +			    pendingIPD = bpDim;
  +			}
  +			// Add BP to the list even though we can't break here
  +			// We need to keep it for area generation
  +			m_vecInlineBreaks.add(bp);
   		    }
   		}
   		else if (bpDim.min > availIPD.max) {
  @@ -290,36 +249,17 @@
   	    // No more content to layout!
   	    setFinished(true);
   	}
  -	// Backup layoutmanager if necessary
  -	resetChildLM(m_prevBP.getLayoutManager());
  +	// Backup child LM if necessary
  +	if (bp != m_prevBP) {
  +	    // Remove any pending breaks from the vector
  +	    while (m_vecInlineBreaks.lastElement()!=m_prevBP) {
  +		m_vecInlineBreaks.remove(m_vecInlineBreaks.size()-1);
  +	    }
  +	    reset(m_prevBP.getLayoutManager(), m_prevBP.getPosition());
  +	}
           return makeLineBreak(m_prevBP);
       }
   
  -    /**
  -     * Return whether we could end the line at the proposed Position.
  -     * TODO: take keeps into account and distinguish the cost of a
  -     * the break-completely forbidden or some non-0 cost.
  -     * QUESTION: do we need to pass the current LineLM or childLM
  -     * LayoutContext?
  -     */
  -    private boolean couldEndLine(BreakPoss bp) {
  -	if (bp.canBreakAfter()) {
  -	    return true; // no keep, ends on break char
  -	}
  -	else if (bp.isSuppressible()) {
  -	    // NOTE: except at end of content for this LM!!
  -	    // Never break after only space chars or any other sequence
  -	    // of areas which would be suppressed at the end of the line.
  -	    return false; 
  -	}
  -	else {
  -	    // See if could break before next area
  -	    LayoutContext lc=new LayoutContext();
  -	    BPLayoutManager nextLM = getChildLM();
  -	    return (nextLM == null || 
  -		    nextLM.canBreakBefore(lc));
  -	}
  -    }
   
   
       private BreakPoss findHyphenPoss(BreakPoss prevBP, BreakPoss newBP) {
  @@ -356,11 +296,10 @@
   		new BreakPossPosIter(m_vecInlineBreaks,
   				     iStartPos, lbp.m_iPos+1);
   	    iStartPos = lbp.m_iPos+1;
  -	    while  (inlinePosIter.hasNext() && 
  -		    (childLM = inlinePosIter.getNextChildLM())!= null) {
  +	    while  ((childLM = inlinePosIter.getNextChildLM())!= null) {
   		childLM.addAreas(inlinePosIter);
   	    }
  -	    verticalAlign(m_lineArea);
  +	    // verticalAlign(m_lineArea);
   	    parentLM.addChild(m_lineArea);
   	}
   	m_lineArea = null;
  
  
  
  1.8       +2 -2      xml-fop/src/org/apache/fop/layoutmgr/LineLayoutManager.java
  
  Index: LineLayoutManager.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/layoutmgr/LineLayoutManager.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- LineLayoutManager.java	28 Apr 2002 21:28:01 -0000	1.7
  +++ LineLayoutManager.java	10 May 2002 12:38:15 -0000	1.8
  @@ -1,5 +1,5 @@
   /*
  - * $Id: LineLayoutManager.java,v 1.7 2002/04/28 21:28:01 klease Exp $
  + * $Id: LineLayoutManager.java,v 1.8 2002/05/10 12:38:15 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.
  @@ -44,7 +44,7 @@
    *
    * How do we handle Unicode BIDI?
    */
  -public class LineLayoutManager extends AbstractBPLayoutManager {
  +public class LineLayoutManager extends AbstractLayoutManager {
       private LineInfo currentLine = null;
       private boolean bFirstLine = true;
       private MinOptMax totalIPD;
  
  
  
  1.4       +15 -2     xml-fop/src/org/apache/fop/layoutmgr/SpaceSpecifier.java
  
  Index: SpaceSpecifier.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/layoutmgr/SpaceSpecifier.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SpaceSpecifier.java	28 Apr 2002 21:28:01 -0000	1.3
  +++ SpaceSpecifier.java	10 May 2002 12:38:16 -0000	1.4
  @@ -1,5 +1,5 @@
   /*
  - * $Id: SpaceSpecifier.java,v 1.3 2002/04/28 21:28:01 klease Exp $
  + * $Id: SpaceSpecifier.java,v 1.4 2002/05/10 12:38:16 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.
  @@ -16,7 +16,7 @@
    * areas with a stacking constraint. Provide a way to resolve these into
    * a single MinOptMax value.
    */
  -public class SpaceSpecifier {
  +public class SpaceSpecifier implements Cloneable {
   
   
       private boolean m_bStartsRefArea;
  @@ -26,6 +26,19 @@
   
       public SpaceSpecifier(boolean bStartsRefArea) {
   	m_bStartsRefArea = bStartsRefArea;
  +    }
  +
  +    public Object clone() {
  +	try {
  +	    SpaceSpecifier ss = (SpaceSpecifier)super.clone();
  +	    // Clone the vector, but share the objects in it!
  +	    ss.m_vecSpaceVals = new Vector(this.m_vecSpaceVals.size());
  +	    ss.m_vecSpaceVals.addAll(this.m_vecSpaceVals);
  +	    return ss;
  +	} catch (CloneNotSupportedException cnse) {
  +	    return null;
  +	}
  +	
       }
   
       /**
  
  
  
  1.2       +30 -12    xml-fop/src/org/apache/fop/layoutmgr/TextBPLayoutManager.java
  
  Index: TextBPLayoutManager.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/layoutmgr/TextBPLayoutManager.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TextBPLayoutManager.java	28 Apr 2002 21:31:00 -0000	1.1
  +++ TextBPLayoutManager.java	10 May 2002 12:38:16 -0000	1.2
  @@ -1,5 +1,5 @@
   /*
  - * $Id: TextBPLayoutManager.java,v 1.1 2002/04/28 21:31:00 klease Exp $
  + * $Id: TextBPLayoutManager.java,v 1.2 2002/05/10 12:38:16 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.
  @@ -195,6 +195,30 @@
   		 (CharUtilities.isSpace(c) || s_breakChars.indexOf(c)>=0)));
       }
   
  +    /** Reset position for returning next BreakPossibility. */
  +
  +    public void resetPosition(BreakPoss.Position prevPos) {
  +	if (prevPos != null) {
  +	    TextBreakPosition tbp = (TextBreakPosition)prevPos;
  +	    AreaInfo ai =
  +		 (AreaInfo) m_vecAreaInfo.elementAt(tbp.m_iAreaIndex);
  +	    if (ai.m_iBreakIndex != m_iNextStart) {
  +		m_iNextStart = ai.m_iBreakIndex;
  +		m_vecAreaInfo.setSize(tbp.m_iAreaIndex+1);
  +		System.err.println("Discarded previous text break pos");
  +		setFinished(false);
  +	    }
  +	}
  +	else {
  +	    // Reset to beginning!
  +	    System.err.println("TextBPLM: resetPosition(null)");
  +	    m_vecAreaInfo.setSize(0);
  +	    m_iNextStart = 0;
  +	    setFinished(false);
  +	}
  +    }
  +
  +
       /**
        * Return the next break possibility that fits the constraints.
        * @param context An object specifying the flags and input information
  @@ -229,17 +253,6 @@
   	    iFlags |= BreakPoss.ISFIRST;
   	}
   
  -	if (prevPos != null) {
  -	    TextBreakPosition tbp = (TextBreakPosition)prevPos;
  -	    AreaInfo ai =
  -		 (AreaInfo) m_vecAreaInfo.elementAt(tbp.m_iAreaIndex);
  -	    if (ai.m_iBreakIndex != m_iNextStart) {
  -		m_iNextStart = ai.m_iBreakIndex;
  -		m_vecAreaInfo.setSize(tbp.m_iAreaIndex+1);
  -		System.err.println("Discarded previous text break pos");
  -	    }
  -	}
  -
   
           // HANDLE SUPPRESSED LEADING SPACES
   	if ((context.flags & LayoutContext.SUPPRESS_LEADING_SPACE)!=0) {
  @@ -249,6 +262,7 @@
   		     chars[m_iNextStart]==SPACE; m_iNextStart++);
   	    // If now at end, nothing to compose here!
   	    if (m_iNextStart >= chars.length) {
  +		setFinished(true);
   		return null; // Or an "empty" BreakPoss?
   	    }
   	}
  @@ -364,6 +378,10 @@
   	if (trailingSpace != null) {
   	    bp.setTrailingSpace(trailingSpace);
   	}
  +	else {
  +	    bp.setTrailingSpace(new SpaceSpecifier(false));
  +	}
  +	bp.setLeadingSpace(new SpaceSpecifier(false));
           return bp;
       }
   
  
  
  
  1.1                  xml-fop/src/org/apache/fop/layoutmgr/InlineStackingBPLayoutManager.java
  
  Index: InlineStackingBPLayoutManager.java
  ===================================================================
  /*
   * $Id: InlineStackingBPLayoutManager.java,v 1.1 2002/05/10 12:38:15 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.layoutmgr;
  
  import org.apache.fop.fo.FObj;
  import org.apache.fop.fo.PropertyManager;
  import org.apache.fop.layout.BorderAndPadding;
  import org.apache.fop.traits.InlineProps;
  import org.apache.fop.area.Area;
  import org.apache.fop.area.MinOptMax;
  import org.apache.fop.area.inline.InlineArea;
  import org.apache.fop.area.inline.InlineParent;
  
  import java.util.Iterator;
  import java.util.ListIterator;
  
  /**
   * LayoutManager for objects which stack children in the inline direction,
   * such as Inline or Line
   */
  public class InlineStackingBPLayoutManager extends AbstractBPLayoutManager {
  
      /**
       * Private class to store information about a lower-level BreakPosition.
       * Note: fields are directly readable in this class
       */
      private static class WrappedPosition implements BreakPoss.Position {
          BPLayoutManager m_childLM;
          BreakPoss.Position m_childPosition;
  
          WrappedPosition(BPLayoutManager childLM,
  			BreakPoss.Position childPosition) {
              m_childLM = childLM;
              m_childPosition = childPosition;
          }
      }
  
      private static class StackingIter extends PositionIterator {
  
  	StackingIter(Iterator parentIter) {
  	    super(parentIter);
  	}
  
  	protected BPLayoutManager getLM(Object nextObj) {
  	    return ((WrappedPosition)nextObj).m_childLM;
  	}
  
  	protected BreakPoss.Position getPos(Object nextObj) {
  	    return ((WrappedPosition)nextObj).m_childPosition;
  	}
  
      }
  
  
      /**
       * Holds IPD of all areas which would be generated by previously
       * complete childLM since last area was generated.
       */
      private MinOptMax m_prevContentIPD = new MinOptMax(0);
  
      /**
       * Size of any start or end borders and padding.
       */
      private MinOptMax m_allocIPD = new MinOptMax(0);
  
      /**
       * Size of border and padding in BPD (ie, before and after).
       */
      private MinOptMax m_extraBPD;
  
      /** Holds IPD of a child BP which had no break-after flag. We don't
       * add this to m_previousIPD until we are sure that the next break
       * position can really fit.
       */
      private MinOptMax m_pendingIPD = new MinOptMax(0);
  
      private InlineProps m_inlineProps = null;
      private BorderAndPadding m_borderProps = null;
  
      private InlineParent m_inlineArea;
  
      private boolean m_bFirstArea;
      private BreakPoss m_prevBP;
  
      public InlineStackingBPLayoutManager(FObj fobj, ListIterator childLMiter) {
  	super(fobj, childLMiter);
  	m_bFirstArea = true;
  	// Initialize inline properties (borders, padding, space)
  	// initProperties();
      }
  
      public boolean generatesInlineAreas() {
          return true;
      }
  
      protected void initProperties(PropertyManager propMgr) {
  	// super.initProperties(propMgr);
  	System.err.println("InlineStackingBPLayoutManager.initProperties called");
          m_inlineProps = propMgr.getInlineProps();
          m_borderProps = propMgr.getBorderAndPadding();
  	// Calculdate border and padding size in BPD
  	int iPad = m_borderProps.getPadding(BorderAndPadding.BEFORE, false);
  	iPad += m_borderProps.getBorderWidth(BorderAndPadding.BEFORE, false);
  	iPad += m_borderProps.getPadding(BorderAndPadding.AFTER, false);
  	iPad += m_borderProps.getBorderWidth(BorderAndPadding.AFTER, false);
  	m_extraBPD = new MinOptMax(iPad);
      }
  
      private MinOptMax getExtraIPD(boolean bNotFirst, boolean bNotLast) {
  	int iBP = m_borderProps.getPadding(BorderAndPadding.START, bNotFirst);
  	iBP += m_borderProps.getBorderWidth(BorderAndPadding.START, bNotFirst);
  	iBP += m_borderProps.getPadding(BorderAndPadding.END, bNotLast);
  	iBP += m_borderProps.getBorderWidth(BorderAndPadding.END, bNotLast);
  	return new MinOptMax(iBP);
      }
  
      private boolean hasLeadingFence(boolean bNotFirst) {
  	int iBP = m_borderProps.getPadding(BorderAndPadding.START, bNotFirst);
  	iBP += m_borderProps.getBorderWidth(BorderAndPadding.START, bNotFirst);
  	return (iBP > 0);
      }
      
      private boolean hasTrailingFence(boolean bNotLast) {
  	int iBP = m_borderProps.getPadding(BorderAndPadding.END, bNotLast);
  	iBP += m_borderProps.getBorderWidth(BorderAndPadding.END, bNotLast);
  	return (iBP > 0);
      }
      
  
      /** Reset position for returning next BreakPossibility. */
  
      public void resetPosition(BreakPoss.Position prevPos) {
  	WrappedPosition wrappedPos = (WrappedPosition)prevPos;
  	if (wrappedPos != null) {
  	    // Back up the layout manager iterator
  	    reset(wrappedPos.m_childLM, wrappedPos.m_childPosition);
  	}
  	else {
  	    // Backup to first child layout manager
  	    System.err.println("InlineStackingBPLM: resetPosition(null)");
  	    super.resetPosition(prevPos);
  	}
  	// Do we need to reset some context like pending or prevContent?
      }
  
  
      /**
       * Return value indicating whether the next area to be generated could
       * start a new line. This should only be called in the "START" condition
       * if a previous inline BP couldn't end the line.
       * Return true if any space-start, border-start or padding-start, else
       * propagate to first child LM
       */
      public boolean canBreakBefore(LayoutContext context) {
  	if (m_inlineProps.spaceStart.space.min > 0 ||
  	    hasLeadingFence(false)) {
  	    return true;
  	}
  	BPLayoutManager lm = getChildLM();
  	if (lm != null) {
  	    return lm.canBreakBefore(context);
  	}
  	else return false; // ??? NO child LM?
      }
  
  
      public BreakPoss getNextBreakPoss(LayoutContext lc,
  				      BreakPoss.Position pbp) {
          // Get a break from currently active child LM
          BreakPoss bp =null;
  	BPLayoutManager curLM ;
  	// Handle space before
  	boolean bIncludeStartSpace=false;
  	LayoutContext childLC = new LayoutContext(lc);
  	if (lc.isStart()) {
  	    // First call to this LM in new parent "area", ie, this may
  	    // not be the first area created by this inline
  	    lc.getPendingSpace().addSpace(m_inlineProps.spaceStart);
  	    // Check for "fence"
  	    if (hasLeadingFence(!m_bFirstArea)) {
  		bIncludeStartSpace=true;
  		// Reset leading space sequence for child areas
  		childLC.setPendingSpace(new SpaceSpecifier(false));
  	    }
  	    // Reset state variables
  	    m_pendingIPD = new MinOptMax(0);
  	    m_prevContentIPD = new MinOptMax(0);
  	}
  	else {
  	    // Handle pending IPD: if we are called again, we assume previous
  	    // break was OK
  	    m_prevContentIPD.add(m_pendingIPD);
  	    m_pendingIPD = new MinOptMax(0);
  	}
  // 	    if (m_prevChildLM != curLM && m_prevChildLM != null) {
  // 		// Change child LM
  // 		m_prevContentIPD.add(m_pendingIPD);
  // 	    }
  
          while ((curLM = getChildLM()) != null) {
  	    // ????
  	    /* If first break for this child, set START_AREA flag */
  	    if (m_prevBP == null || m_prevBP.getLayoutManager()!=curLM) {
  		childLC.setFlags(LayoutContext.START_AREA);
  		if (m_prevBP != null) {
  		    childLC.setPendingSpace(m_prevBP.getTrailingSpace());
  		}
  	    }
  
  	    if (((bp = curLM.getNextBreakPoss(childLC)) != null)) {
  		// && couldEndLine(bp)) {
  		break;
  	    }
  // 	    if (bp.isLastArea()) {
  // 		// NORMALLY IT MUST BE!
  // 		m_pendingIPD.add(bp.getStackingSize());
  // 		m_prevBP = bp;
  // 	    }
          }
          if (bp==null) {
  	    setFinished(true);
              return null; // There was no childLM
              // Alternative is to return a BP with the isLast flag set
          }
          else {
  	    // TODO! need to know whether this BP is in the first area for FO!
              return makeBreakPoss(bp, lc.isStart(),
  				 (getChildLM() == null), lc);
          }
      }
  
      protected boolean couldEndLine(BreakPoss bp) {
  	if (bp.canBreakAfter()) {
  	    return true; // no keep, ends on break char
  	}
  	else if (bp.isSuppressible()) {
  	    // NOTE: except at end of content for this LM!!
  	    // Never break after only space chars or any other sequence
  	    // of areas which would be suppressed at the end of the line.
  	    return false; 
  	}
  	else {
  	    // See if could break before next area
  	    LayoutContext lc=new LayoutContext();
  	    BPLayoutManager nextLM = getChildLM();
  	    return (nextLM == null || 
  		    nextLM.canBreakBefore(lc));
  	}
      }
  
  
  
      protected BreakPoss makeBreakPoss(BreakPoss bp, boolean bIsFirst, 
  				   boolean bIsLast, LayoutContext lc) {
          WrappedPosition inlbp =
              new WrappedPosition(bp.getLayoutManager(), bp.getPosition());
  	BreakPoss myBP = new BreakPoss(this, inlbp, bp.getFlags());
  
          // Update dimension information for our allocation area,
  	// including child areas
          // generated by previous childLM which have completed layout
          // Update pending area measure
          // This includes all previous breakinfo
  	
  	MinOptMax bpDim = (MinOptMax)bp.getStackingSize().clone();
  
          if (m_prevBP == null ||
  	    m_prevBP.getLayoutManager() != bp.getLayoutManager()) {
  	    /* This is first bp generated by child (in this parent area).
  	     * Calculate space-start on this area in combination with any
  	     * pending space-end on previously generated break possibilities.
  	     * Can also have leading space if this FO has fence-preceding.
  	     */
  	    bpDim.add(bp.resolveLeadingSpace());
          }
          if (bp.isLastArea()) {
  	    m_pendingIPD.add(bpDim);
  	    // See if our area is also done
  	    
          }
  
  	// Start and end borders and padding
  	bpDim.add(m_prevContentIPD);
  	bpDim.add(getExtraIPD(!bIsFirst, !bIsLast));
  	myBP.setStackingSize(bpDim);
  	myBP.setNonStackingSize(MinOptMax.add(bp.getNonStackingSize(),
  					      m_extraBPD));
          if (bIsLast) {
  	    setFinished(true);  // Our last area, so indicate done
              myBP.setFlag(BreakPoss.ISLAST, true);
          }
  	else {
              myBP.setFlag(BreakPoss.ISLAST, false);
  	}
  	myBP.setTrailingSpace((SpaceSpecifier)bp.getTrailingSpace().clone());
  	myBP.getTrailingSpace().addSpace(m_inlineProps.spaceEnd);
  	// If this FO doesn't have fence-start, then this value should
  	// come from the lower level BP!
  	myBP.setLeadingSpace(new SpaceSpecifier(false));
  	m_prevBP = bp;
  	return myBP;
      }
  
  
  
      /******
      protected BreakableText getText(BreakPoss prevBP, BreakPoss lastBP) {
      }
      *****/
  
      // Generate and add areas to parent area
      // Set size etc
      public void addAreas(PositionIterator parentIter) {
          // Make areas from start to end
          // Update childLM based on bpEnd
          // It might be a previous sibling of the current one!
  
          m_inlineArea = new InlineParent();
         
  	// Note: if first, bpStart is perhaps null????
  	// If we are first in parent, set ISFIRST...
  
  
  	// posIter iterates over positions returned by this LM
  	StackingIter childPosIter = new StackingIter(parentIter);
  	BPLayoutManager childLM ;
  	while  ((childLM = childPosIter.getNextChildLM())!= null) {
  	    childLM.addAreas(childPosIter);
  	}
  	
  	parentLM.addChild(m_inlineArea);
      }
  
  
  //     protected Area createArea() {
  //         return new InlineParent();
  //     }
  
      public boolean addChild(Area childArea) {
  	// Make sure childArea is inline area
  	if (childArea instanceof InlineArea) {
  	    m_inlineArea.addChild((InlineArea)childArea);
  	}
  	return false;
      }
  
  
  }
  
  
  
  1.1                  xml-fop/src/org/apache/fop/layoutmgr/LMiter.java
  
  Index: LMiter.java
  ===================================================================
  /*
   * $Id: LMiter.java,v 1.1 2002/05/10 12:38:15 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.layoutmgr;
  
  import org.apache.fop.fo.FObj;
  
  import java.util.ArrayList;
  import java.util.ListIterator;
  import java.util.NoSuchElementException;
  
  public class LMiter implements ListIterator {
  
  
      private ListIterator m_baseIter;
      private FObj m_curFO;
      private ArrayList m_listLMs;
      private int m_curPos=0;
  
      public LMiter(ListIterator baseIter) {
  	m_baseIter = baseIter;
  	m_listLMs = new ArrayList(10);
      }
  
      public boolean hasNext() {
  	return (m_curPos < m_listLMs.size())? true :
  	    preLoadNext();
      }
  
      private boolean preLoadNext() {
  	if (m_baseIter.hasNext()) {
  	    FObj fobj = (FObj)m_baseIter.next();
  	    //m_listLMs.add(fobj.getLayoutManager());
  	    fobj.addLayoutManager(m_listLMs);
  	    return true;
  	}
  	else return false;
      }
  
      public boolean hasPrevious() {
  	return (m_curPos > 0);
      }
  
      public Object previous() throws NoSuchElementException {
  	if (m_curPos > 0) {
  	    return m_listLMs.get(--m_curPos);
  	}
  	else throw new NoSuchElementException();
      }
  
      public Object next() throws NoSuchElementException {
  	if (m_curPos < m_listLMs.size()) {
  	    return m_listLMs.get(m_curPos++);
  	}
  	else throw new NoSuchElementException();
      }
      
      public void remove() throws NoSuchElementException {
  	if (m_curPos > 0) {
  	    m_listLMs.remove(--m_curPos);
  	    // Note: doesn't actually remove it from the base!
  	}
  	else throw new NoSuchElementException();
  	
      }
  
  
      public void add(Object o) throws UnsupportedOperationException  {
  	throw new UnsupportedOperationException("LMiter doesn't support add");
      }
  
      public void set(Object o) throws UnsupportedOperationException {
  	throw new UnsupportedOperationException("LMiter doesn't support set");
      }
  
      public int nextIndex() {
  	return m_curPos;
      }
  
      public int previousIndex() {
  	return m_curPos - 1;
      }
  
  }
  
  
  

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