gmazza      2003/12/27 13:03:34

  Modified:    src/java/org/apache/fop/layoutmgr LineLayoutManager.java
  Log:
  Bug 25756 (Patch by Simon Pepping):  Remove line BPs where line consists
  only of suppressible content (whitespace).
  
  Revision  Changes    Path
  1.9       +36 -1     xml-fop/src/java/org/apache/fop/layoutmgr/LineLayoutManager.java
  
  Index: LineLayoutManager.java
  ===================================================================
  RCS file: 
/home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/LineLayoutManager.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- LineLayoutManager.java    23 Dec 2003 20:41:58 -0000      1.8
  +++ LineLayoutManager.java    27 Dec 2003 21:03:34 -0000      1.9
  @@ -325,7 +325,15 @@
               return null;
           }
           if (prevBP == null) {
  -            prevBP = bp;
  +            BreakPoss prevLineEnd = (iPrevLineEnd == 0)
  +                ? null
  +                : (BreakPoss) vecInlineBreaks.get(iPrevLineEnd);
  +            if (allAreSuppressible(prevLineEnd)) {
  +                removeAllBP(prevLineEnd);
  +                return null;
  +            } else {
  +                prevBP = bp;
  +            }
           }
   
           // Choose the best break
  @@ -419,6 +427,33 @@
               if (!couldEndLine || bp == prev) break;
           }
           return couldEndLine;
  +    }
  +
  +    /** Test whether all breakposs in vecInlineBreaks
  +        back to and excluding prev are suppressible */
  +    private boolean allAreSuppressible(BreakPoss prev) {
  +        ListIterator bpIter =
  +            vecInlineBreaks.listIterator(vecInlineBreaks.size());
  +        boolean allAreSuppressible = true;
  +        BreakPoss bp;
  +        while (bpIter.hasPrevious()
  +               && (bp = (BreakPoss) bpIter.previous()) != prev
  +               && (allAreSuppressible = bp.isSuppressible())) {
  +        }
  +        return allAreSuppressible;
  +    }
  +
  +    /** Remove all BPs from the end back to and excluding prev
  +        from vecInlineBreaks*/
  +    private void removeAllBP(BreakPoss prev) {
  +        int iPrev;
  +        if (prev == null) {
  +            vecInlineBreaks.clear();
  +        } else if ((iPrev = vecInlineBreaks.indexOf(prev)) != -1) {
  +            for (int i = vecInlineBreaks.size(); iPrev < i; --i) {
  +                vecInlineBreaks.remove(i);
  +            }
  +        }
       }
   
       private HyphContext getHyphenContext(BreakPoss prev,
  
  
  

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

Reply via email to