]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Moved the text-splitting logic from TextArea to TextLM, as suggested by Manuel and...
authorLuca Furini <lfurini@apache.org>
Thu, 27 Oct 2005 14:38:12 +0000 (14:38 +0000)
committerLuca Furini <lfurini@apache.org>
Thu, 27 Oct 2005 14:38:12 +0000 (14:38 +0000)
Some simplification in TextLM#addAreas().

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@328882 13f79535-47bb-0310-9956-ffa450edef68

13 files changed:
src/java/org/apache/fop/area/inline/SpaceArea.java
src/java/org/apache/fop/area/inline/TextArea.java
src/java/org/apache/fop/area/inline/UnresolvedPageNumber.java
src/java/org/apache/fop/area/inline/WordArea.java
src/java/org/apache/fop/layoutmgr/inline/LeaderLayoutManager.java
src/java/org/apache/fop/layoutmgr/inline/PageNumberCitationLayoutManager.java
src/java/org/apache/fop/layoutmgr/inline/PageNumberLayoutManager.java
src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java
src/java/org/apache/fop/render/AbstractRenderer.java
src/java/org/apache/fop/render/java2d/Java2DRenderer.java
src/java/org/apache/fop/render/ps/PSRenderer.java
src/java/org/apache/fop/render/svg/SVGRenderer.java
src/java/org/apache/fop/util/CharUtilities.java

index 1b5a1ae6e2147370a62013a0cae9b2b50392e8e6..6ec573107d8813bd7c63954da32a331340a59caa 100644 (file)
@@ -31,13 +31,22 @@ public class SpaceArea extends InlineArea {
      * The correction offset for the next area\r
      */\r
     protected int offset = 0;\r
+    \r
+    /**\r
+     * Is this space adjustable?\r
+     */\r
+    protected boolean isAdjustable;\r
 \r
     /**\r
-     * Create a text inline area\r
+     * Create a space area\r
      * @param s the space character\r
+     * @param o the offset for the next area\r
+     * @param a is this space adjustable?\r
      */\r
-    public SpaceArea(char s) {\r
+    public SpaceArea(char s, int o, boolean a) {\r
         space = new String() + s;\r
+        offset = o;\r
+        isAdjustable = a;\r
     }\r
     \r
     /**\r
index d57171e8ac486a9ecd16be7124656033cff0f072..3bee4254f3ae28011b3cffb06fdedff7b7aef68c 100644 (file)
@@ -18,8 +18,6 @@
 
 package org.apache.fop.area.inline;
 
-import org.apache.fop.util.CharUtilities;
-
 /**
  * A text inline area.
  */
@@ -43,46 +41,49 @@ public class TextArea extends AbstractTextArea {
     }
 
     /**
-     * Set the text string
-     *
-     * @param t the text string
+     * Remove the old text
      */
-    public void setText(String t) {
-        // split the text and create WordAreas and SpaceAreas
-        char charArray[] = t.toCharArray();
-        int wordStartIndex = -1;
-        for (int i = 0; i < charArray.length; i ++) {
-            if (CharUtilities.isAnySpace(charArray[i])) {
-                // a space character
-                // create a SpaceArea child
-                SpaceArea space = new SpaceArea(charArray[i]);
-                this.addChildArea(space);
-                space.setParentArea(this);
-            } else {
-                // a non-space character
-                if (wordStartIndex == -1) {
-                    // first character of the text, or after a space
-                    wordStartIndex = i;
-                }
-                if (i == charArray.length - 1
-                        || CharUtilities.isAnySpace(charArray[i + 1])) {
-                    // last character before the end of the text or a space:
-                    // create a WordArea child
-                    WordArea word = new WordArea(t.substring(wordStartIndex, i + 1));
-                    this.addChildArea(word);
-                    word.setParentArea(this);
-                    wordStartIndex = -1;
-                }
-            }
-        }
+    public void removeText() {
+        inlines.clear();
     }
-
+    
+    /**
+     * Create and add a WordArea child to this TextArea.
+     * 
+     * @param word   the word string
+     * @param offset the offset for the next area
+     */
+    public void addWord(String word, int offset) {
+        WordArea wordArea = new WordArea(word, offset);
+        addChildArea(wordArea);
+        wordArea.setParentArea(this);
+    }
+    
+    /**
+     * Create and add a SpaceArea child to this TextArea
+     * 
+     * @param space      the space character
+     * @param offset     the offset for the next area
+     * @param adjustable is this space adjustable?
+     */
+    public void addSpace(char space, int offset, boolean adjustable) {
+        SpaceArea spaceArea = new SpaceArea(space, offset, adjustable);
+        addChildArea(spaceArea);
+        spaceArea.setParentArea(this);
+    }
+    
     /**
-     * Get the text string.
+     * Get the whole text string.
+     * Renderers whose space adjustment handling is not affected 
+     * by multi-byte characters can use this method to render the
+     * whole TextArea at once; the other renderers (for example 
+     * PDFRenderer) have to implement renderWord(WordArea) and 
+     * renderSpace(SpaceArea) in order to correctly place each
+     * text fragment.
      *
      * @return the text string
      */
-    public String getTextArea() {
+    public String getText() {
         StringBuffer text = new StringBuffer();
         InlineArea child;
         // assemble the text
index 0b429b6651a33fd69bcc2d7e9806c008bc8fa8b5..7b5eae9417b3d8fbdb4a11db9e967677c98d003c 100644 (file)
@@ -70,7 +70,9 @@ public class UnresolvedPageNumber extends TextArea implements Resolvable {
         if (pageIDRef.equals(id) && pages != null) {
             resolved = true;
             PageViewport page = (PageViewport)pages.get(0);
-            setText(page.getPageNumberString());
+            // replace the text
+            removeText();
+            addWord(page.getPageNumberString(), 0);
             // update ipd
             updateIPD(getStringWidth(text));
             // set the Font object to null, as we don't need it any more
index c766e0e62e6fdb90cdd30dc7ec329e87fbc1c2cc..b998b819e29db54b39c98078f6133d5be661438f 100644 (file)
@@ -33,11 +33,13 @@ public class WordArea extends InlineArea {
     protected int offset = 0;\r
 \r
     /**\r
-     * Create a text inline area\r
+     * Create a word area\r
      * @param w the word string\r
+     * @param o the offset for the next area\r
      */\r
-    public WordArea(String w) {\r
+    public WordArea(String w, int o) {\r
         word = w;\r
+        offset = o;\r
     }\r
 \r
     /**\r
index d7983a9f602af16808df8a11c337393b33c77fc2..f16b78553f1e87081d9cd6ce7cc07a00cd1318a7 100644 (file)
@@ -129,7 +129,7 @@ public class LeaderLayoutManager extends LeafNodeLayoutManager {
             char dot = '.'; // userAgent.getLeaderDotCharacter();
 
             int width = font.getCharWidth(dot);
-            t.setText("" + dot);
+            t.addWord("" + dot, 0);
             t.setIPD(width);
             t.setBPD(width);
             t.setBaselineOffset(width);
index e1c8c29d6060a342766a5f3b40486df6715658ad..37f23c9473236406f03f3165df6b1a695ac5df6b 100644 (file)
@@ -25,7 +25,6 @@ import org.apache.fop.area.Trait;
 import org.apache.fop.area.inline.InlineArea;
 import org.apache.fop.area.inline.UnresolvedPageNumber;
 import org.apache.fop.area.inline.TextArea;
-import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
 import org.apache.fop.fonts.Font;
 import org.apache.fop.layoutmgr.LayoutContext;
 import org.apache.fop.layoutmgr.LayoutManager;
@@ -105,7 +104,7 @@ public class PageNumberCitationLayoutManager extends LeafNodeLayoutManager {
             TextArea text = new TextArea();
             inline = text;
             int width = getStringWidth(str);
-            text.setText(str);
+            text.addWord(str, 0);
             inline.setIPD(width);
             
             resolved = true;
index 7cbcd77c48b9166b5626e6140db5595ef0eb0ca3..09daeb21206a7e7d9d3439cb5f5550c21182b0ce 100644 (file)
@@ -22,7 +22,6 @@ import org.apache.fop.fo.flow.PageNumber;
 import org.apache.fop.area.inline.InlineArea;
 import org.apache.fop.area.inline.TextArea;
 import org.apache.fop.area.Trait;
-import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
 import org.apache.fop.fonts.Font;
 import org.apache.fop.layoutmgr.LayoutContext;
 import org.apache.fop.layoutmgr.TraitSetter;
@@ -75,7 +74,7 @@ public class PageNumberLayoutManager extends LeafNodeLayoutManager {
         TextArea text = new TextArea();
         String str = getCurrentPV().getPageNumberString();
         int width = getStringWidth(str);
-        text.setText(str);
+        text.addWord(str, 0);
         text.setIPD(width);
         text.setBPD(font.getAscender() - font.getDescender());
         text.setBaselineOffset(font.getAscender());
@@ -109,9 +108,10 @@ public class PageNumberLayoutManager extends LeafNodeLayoutManager {
     
     private void updateContent(TextArea area) {
         // get the page number of the page actually being built
-        area.setText(getCurrentPV().getPageNumberString());
+        area.removeText();
+        area.addWord(getCurrentPV().getPageNumberString(), 0);
         // update the ipd of the area
-        area.updateIPD(getStringWidth(area.getTextArea()));
+        area.updateIPD(getStringWidth(area.getText()));
         // update the width stored in the AreaInfo object
         areaInfo.ipdArea = new MinOptMax(area.getIPD());
     }
index f2e1cde33c0528bd9e17a8a8ef2cbe3f638fa2bd..cbf798b03351e016526ff7a70025e65aa96e9746 100644 (file)
@@ -24,7 +24,6 @@ import java.util.LinkedList;
 import java.util.ListIterator;
 
 import org.apache.fop.area.Trait;
-import org.apache.fop.area.inline.InlineArea;
 import org.apache.fop.area.inline.TextArea;
 import org.apache.fop.fo.FOText;
 import org.apache.fop.fo.flow.Inline;
@@ -41,6 +40,7 @@ import org.apache.fop.layoutmgr.PositionIterator;
 import org.apache.fop.layoutmgr.TraitSetter;
 import org.apache.fop.traits.MinOptMax;
 import org.apache.fop.traits.SpaceVal;
+import org.apache.fop.util.CharUtilities;
 
 /**
  * LayoutManager for text (a sequence of characters) which generates one
@@ -260,9 +260,10 @@ public class TextLayoutManager extends LeafNodeLayoutManager {
 
         // Add word areas
         AreaInfo ai = null;
-        int iStart = -1;
         int iWScount = 0;
         int iLScount = 0;
+        int firstAreaInfoIndex = -1;
+        int lastAreaInfoIndex = 0;
         MinOptMax realWidth = new MinOptMax(0);
 
         /* On first area created, add any leading space.
@@ -273,12 +274,13 @@ public class TextLayoutManager extends LeafNodeLayoutManager {
             //
             if (tbpNext.getLeafPos() != -1) {
                 ai = (AreaInfo) vecAreaInfo.get(tbpNext.getLeafPos());
-                if (iStart == -1) {
-                    iStart = ai.iStartIndex;
+                if (firstAreaInfoIndex == -1) {
+                    firstAreaInfoIndex = tbpNext.getLeafPos();
                 }
                 iWScount += ai.iWScount;
                 iLScount += ai.iLScount;
                 realWidth.add(ai.ipdArea);
+                lastAreaInfoIndex = tbpNext.getLeafPos();
             }
         }
         if (ai == null) {
@@ -291,20 +293,8 @@ public class TextLayoutManager extends LeafNodeLayoutManager {
             iLScount--;
         }
 
-        // Make an area containing all characters between start and end.
-        InlineArea word = null;
-        int adjust = 0;
-        
-        // ignore newline character
-        if (textArray[ai.iBreakIndex - 1] == NEWLINE) {
-            adjust = 1;
-        }
-        String str = new String(textArray, iStart,
-                                ai.iBreakIndex - iStart - adjust);
-
         // add hyphenation character if the last word is hyphenated
         if (context.isLastArea() && ai.bHyphenated) {
-            str += foText.getCommonHyphenation().hyphenationCharacter;
             realWidth.add(new MinOptMax(hyphIPD));
         }
 
@@ -355,8 +345,10 @@ public class TextLayoutManager extends LeafNodeLayoutManager {
             iTotalAdjust = iDifference;
         }
 
-        TextArea t = createTextArea(str, realWidth, iTotalAdjust, context,
-                                    wordSpaceIPD.opt - spaceCharIPD);
+        TextArea t = createTextArea(realWidth, iTotalAdjust, context,
+                                    wordSpaceIPD.opt - spaceCharIPD,
+                                    firstAreaInfoIndex, lastAreaInfoIndex,
+                                    context.isLastArea());
 
         // iWordSpaceDim is computed in relation to wordSpaceIPD.opt
         // but the renderer needs to know the adjustment in relation
@@ -378,25 +370,25 @@ public class TextLayoutManager extends LeafNodeLayoutManager {
             t.setSpaceDifference(wordSpaceIPD.opt - spaceCharIPD
                                  - 2 * t.getTextLetterSpaceAdjust());
         }
-        word = t;
-        if (word != null) {
-            parentLM.addChildArea(word);
-        }
+        parentLM.addChildArea(t);
     }
 
     /**
      * Create an inline word area.
      * This creates a TextArea and sets up the various attributes.
      *
-     * @param str the string for the TextArea
      * @param width the MinOptMax width of the content
      * @param adjust the total ipd adjustment with respect to the optimal width
      * @param context the layout context
      * @param spaceDiff unused
+     * @param firstIndex the index of the first AreaInfo used for the TextArea
+     * @param lastIndex the index of the last AreaInfo used for the TextArea 
+     * @param isLastArea is this TextArea the last in a line?
      * @return the new text area
      */
-    protected TextArea createTextArea(String str, MinOptMax width, int adjust,
-                                      LayoutContext context, int spaceDiff) {
+    protected TextArea createTextArea(MinOptMax width, int adjust,
+                                      LayoutContext context, int spaceDiff,
+                                      int firstIndex, int lastIndex, boolean isLastArea) {
         TextArea textArea;
         if (context.getIPDAdjust() == 0.0) {
             // create just a TextArea
@@ -417,7 +409,38 @@ public class TextLayoutManager extends LeafNodeLayoutManager {
             textArea.setOffset(alignmentContext.getOffset());
         }
 
-        textArea.setText(str);
+        // set the text of the TextArea, split into words and spaces
+        int wordStartIndex = -1;
+        AreaInfo areaInfo;
+        for (int i = firstIndex; i <= lastIndex; i ++) {
+            areaInfo = (AreaInfo) vecAreaInfo.get(i);
+            if (areaInfo.iWScount > 0) {
+                // areaInfo stores information about a space
+                // add a space to the TextArea
+                char spaceChar = textArray[areaInfo.iStartIndex];
+                textArea.addSpace(spaceChar, 0, 
+                        CharUtilities.isAdjustableSpace(spaceChar));
+            } else {
+                // areaInfo stores information about a word fragment
+                if (wordStartIndex == -1) {
+                    // here starts a new word
+                    wordStartIndex = areaInfo.iStartIndex;
+                }
+                if (i == lastIndex || ((AreaInfo) vecAreaInfo.get(i + 1)).iWScount > 0) {
+                    // here ends a new word
+                    // add a word to the TextArea
+                    String wordChars = new String(textArray, wordStartIndex, areaInfo.iBreakIndex - wordStartIndex);
+                    if (isLastArea
+                        && i == lastIndex 
+                        && areaInfo.bHyphenated) {
+                        // add the hyphenation character
+                        wordChars += foText.getCommonHyphenation().hyphenationCharacter;
+                    }
+                    textArea.addWord(wordChars, 0);
+                    wordStartIndex = -1;
+                }
+            }
+        }
         textArea.addTrait(Trait.FONT_NAME, font.getFontName());
         textArea.addTrait(Trait.FONT_SIZE, new Integer(font.getFontSize()));
         textArea.addTrait(Trait.COLOR, foText.getColor());
index 0335c2089541163444e24ee19615b353759605c7..6dd4c751078adcfb8ddd318408a2f780a3f8aecd 100644 (file)
@@ -188,7 +188,7 @@ public abstract class AbstractRenderer
             if (inline instanceof Character) {
                 sb.append(((Character) inline).getChar());
             } else if (inline instanceof TextArea) {
-                sb.append(((TextArea) inline).getTextArea());
+                sb.append(((TextArea) inline).getText());
             } else if (inline instanceof InlineParent) {
                 sb.append(convertToString(
                         ((InlineParent) inline).getChildAreas()));
index 4e6cfb20f93fedb0e590e9f9ef5c79b1eaa060ef..4661eb49df1fb9e3f8308b333700a0ebc7b1a3b4 100644 (file)
@@ -741,7 +741,7 @@ public abstract class Java2DRenderer extends AbstractRenderer implements Printab
         ColorType ct = (ColorType) text.getTrait(Trait.COLOR);
         state.updateColor(ct, false, null);
 
-        String s = text.getTextArea();
+        String s = text.getText();
         state.getGraph().drawString(s, x / 1000f, y / 1000f);
 
         // getLogger().debug("renderText(): \"" + s + "\", x: "
index 5d72b8ca05c6b161c6b96048dc20145775d7c63d..1902df16e8a95b71d8b1ac82cca9f2b77dea241e 100644 (file)
@@ -796,7 +796,7 @@ public class PSRenderer extends AbstractPathOrientedRenderer {
      * @see org.apache.fop.render.AbstractRenderer#renderText(TextArea)
      */
     public void renderText(TextArea area) {
-        String text = area.getTextArea();
+        String text = area.getText();
         renderText(area, text);
         super.renderText(area); //Updates IPD
     }
index 74b418a5cf9932f44126c61546888dafeb94a3a5..7a6109ed95c93f3cd2a1e97715e57a6ff7a03cee 100644 (file)
@@ -393,7 +393,7 @@ public class SVGRenderer extends AbstractRenderer implements XMLHandler {
                                                currentIPPosition / 1000,
                                                (currentBPPosition + text.getOffset() 
                                                 + text.getBaselineOffset()) / 1000,
-                                               text.getTextArea());
+                                               text.getText());
         currentPageG.appendChild(textElement);
 
         super.renderText(text);
index c1a537521f141e269529d1ed0f95b0f60f4ea6d1..43c2c3e41171519b55d49e3dcd7d1fcfa46a8b3b 100644 (file)
@@ -119,6 +119,19 @@ public class CharUtilities {
             || c == ZERO_WIDTH_NOBREAK_SPACE);  // zero width no-break space
     }
 
+    /**
+     * Method to determine if the character is an adjustable
+     * space.
+     * @param c character to check
+     * @return True if the character is adjustable
+     */
+    public static boolean isAdjustableSpace(char c) {
+        //TODO: are there other kinds of adjustable spaces?
+        return
+            (c == '\u0020'    // normal space
+            /*|| c == ''*/);
+    }
+    
     /**
      * Determines if the character represents any kind of space.
      * @param c character to check