]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Solve a few problems concerning hyphenation:
authorSimon Pepping <spepping@apache.org>
Sat, 29 May 2004 08:50:46 +0000 (08:50 +0000)
committerSimon Pepping <spepping@apache.org>
Sat, 29 May 2004 08:50:46 +0000 (08:50 +0000)
- show the '-' at the end of the hyphenated lines
- use the fo:hyphenate property to enable hyphenation, instead of the alignment
- specify the hyphenation character using the fo:hyphenation-character property
Patch by Luca Furini, bug 27773

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

src/java/org/apache/fop/fo/PropertyManager.java
src/java/org/apache/fop/fo/TextInfo.java
src/java/org/apache/fop/layoutmgr/LineLayoutManager.java
src/java/org/apache/fop/layoutmgr/TextLayoutManager.java

index d84564d46f8201bb4521b695c085f7a9f2358844..2505c323d17c7d8e399cb9fd8d9481a250b153ee 100644 (file)
@@ -488,6 +488,9 @@ public class PropertyManager implements Constants {
             textInfo.textTransform
                     = this.propertyList.get(PR_TEXT_TRANSFORM).getEnum();
 
+            textInfo.hyphChar = this.propertyList.get(
+                                  PR_HYPHENATION_CHARACTER).getCharacter();
+
         }
         return textInfo;
     }
index 2ef97ac0965f52e9f746d12005221c47cac7c435..c4f97a26f466a83ee06d9ba613e2bc6e3e7f13c7 100644 (file)
@@ -50,8 +50,8 @@ public class TextInfo {
     /** fo:letter-spacing property */
     public SpaceVal letterSpacing;
 
-    /** can this text be hyphenated? */
-    public boolean bCanHyphenate = true;
+    /* the hyphenation character to be used */
+    public char hyphChar = '-';
 
     /** fo:text-decoration property: is text underlined? */
     public boolean underlined = false;
index 3fec261501764f0f18e8711c51cd0a2c348ea106..b3242895310cb00ccc96af54cc7983eb8967a4eb 100644 (file)
@@ -21,6 +21,7 @@ package org.apache.fop.layoutmgr;
 import org.apache.fop.datatypes.Length;
 import org.apache.fop.fo.FObj;
 import org.apache.fop.fo.PropertyManager;
+import org.apache.fop.fo.Constants;
 import org.apache.fop.fo.properties.CommonMarginBlock;
 import org.apache.fop.fo.properties.CommonHyphenation;
 import org.apache.fop.layout.hyphenation.Hyphenation;
@@ -209,7 +210,7 @@ public class LineLayoutManager extends InlineStackingLayoutManager {
 
                     // This break position doesn't fit
                     // TODO: If we are in nowrap, we use it as is!
-                    if (bTextAlignment == TextAlign.JUSTIFY || prevBP == null) {
+                    if (hyphProps.hyphenate == Constants.TRUE) {
                         // If we are already in a hyphenation loop, then stop.
 
                         if (inlineLC.tryHyphenate()) {
index a56233b8a68bd2504179f1ee21e787f34a0d47fc..59ddcc73a3d386e97d60ac8e50efd7d1f98cb52e 100644 (file)
@@ -46,12 +46,14 @@ public class TextLayoutManager extends AbstractLayoutManager {
         private short iBreakIndex;
         private short iWScount;
         private MinOptMax ipdArea;
+        private boolean bHyphenated;
         public AreaInfo(short iSIndex, short iBIndex, short iWS,
-                 MinOptMax ipd) {
+                 MinOptMax ipd, boolean bHyph) {
             iStartIndex = iSIndex;
             iBreakIndex = iBIndex;
             iWScount = iWS;
             ipdArea = ipd;
+            bHyphenated = bHyph;
         }
     }
 
@@ -107,7 +109,7 @@ public class TextLayoutManager extends AbstractLayoutManager {
         // With CID fonts, space isn't neccesary currentFontState.width(32)
         spaceCharIPD = foText.textInfo.fs.getCharWidth(' ');
         // Use hyphenationChar property
-        hyphIPD = foText.textInfo.fs.getCharWidth('-');
+        hyphIPD = foText.textInfo.fs.getCharWidth(foText.textInfo.hyphChar);
         // Make half-space: <space> on either side of a word-space)
         SpaceVal ws = foText.textInfo.wordSpacing;
         halfWS = new SpaceVal(MinOptMax.multiply(ws.getSpace(), 0.5),
@@ -201,7 +203,7 @@ public class TextLayoutManager extends AbstractLayoutManager {
         boolean bCanHyphenate = true;
         int iStopIndex = iNextStart + hc.getNextHyphPoint();
 
-        if (textArray.length < iStopIndex || foText.textInfo.bCanHyphenate == false) {
+        if (textArray.length < iStopIndex) {
             iStopIndex = textArray.length;
             bCanHyphenate = false;
         }
@@ -396,7 +398,8 @@ public class TextLayoutManager extends AbstractLayoutManager {
 
         // Position is the index of the info for this word in the vector
         vecAreaInfo.add(
-          new AreaInfo(iWordStart, iNextStart, iWScount, ipd));
+          new AreaInfo(iWordStart, iNextStart, iWScount, ipd, 
+                       ((flags & BreakPoss.HYPHENATED) != 0)));
         BreakPoss bp = new BreakPoss(
                          new LeafPosition(this, vecAreaInfo.size() - 1));
         ipdTotal = ipd;
@@ -465,6 +468,20 @@ public class TextLayoutManager extends AbstractLayoutManager {
         if (ai == null) {
             return;
         }
+
+        // ignore newline character
+        int adjust = 0;
+        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 (ai.bHyphenated) {
+            str += foText.textInfo.hyphChar;
+            ai.ipdArea = MinOptMax.add(ai.ipdArea, new MinOptMax(hyphIPD));
+        }
+
         // Calculate total adjustment
         int iRealWidth = ai.ipdArea.opt;
         int iAdjust = 0;
@@ -482,13 +499,6 @@ public class TextLayoutManager extends AbstractLayoutManager {
 
         // 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);
 
         if (" ".equals(str)) {
             word = new Space();