]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Fixed a bug with indent handling when margins are used on a surrounding block and...
authorJeremias Maerki <jeremias@apache.org>
Wed, 2 Aug 2006 09:20:10 +0000 (09:20 +0000)
committerJeremias Maerki <jeremias@apache.org>
Wed, 2 Aug 2006 09:20:10 +0000 (09:20 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_Floats@427938 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/fo/properties/IndentPropertyMaker.java
status.xml
test/layoutengine/standard-testcases/block-container_start-indent.xml

index 0eb857c31ce382c901751e9c0913a0bcc0a1913f..ebc1b80f0b3646f93e3a0cd3f3c6152b8cea83d0 100644 (file)
@@ -94,33 +94,32 @@ public class IndentPropertyMaker extends CorrespondingPropertyMaker {
         Numeric border = getCorresponding(borderWidthCorresponding, propertyList).getNumeric();
         
         int marginProp = pList.getWritingMode(lr_tb, rl_tb, tb_rl);
-        Numeric margin;
         // Calculate the absolute margin.
         if (propertyList.getExplicitOrShorthand(marginProp) == null) {
             Property indent = propertyList.getExplicit(baseMaker.propId);
             if (indent == null) {
-                //Neither start-indent nor margin is specified, use inherited
+                //Neither indent nor margin is specified, use inherited
                 return null;
+            } else {
+                //Use explicit indent directly
+                return indent;
             }
-            margin = propertyList.getExplicit(baseMaker.propId).getNumeric();
-            margin = NumericOp.subtraction(margin, 
-                    propertyList.getInherited(baseMaker.propId).getNumeric());
-            margin = NumericOp.subtraction(margin, padding);
-            margin = NumericOp.subtraction(margin, border);
         } else {
-            margin = propertyList.get(marginProp).getNumeric();
+            //Margin is used
+            Numeric margin = propertyList.get(marginProp).getNumeric();
+            
+            Numeric v = new FixedLength(0);
+            if (!propertyList.getFObj().generatesReferenceAreas()) {
+                // The inherited_value_of([start|end]-indent)
+                v = NumericOp.addition(v, propertyList.getInherited(baseMaker.propId).getNumeric());
+            }
+            // The corresponding absolute margin-[right|left}.
+            v = NumericOp.addition(v, margin);
+            v = NumericOp.addition(v, padding);
+            v = NumericOp.addition(v, border);
+            return (Property) v;
         }
         
-        Numeric v = new FixedLength(0);
-        if (!propertyList.getFObj().generatesReferenceAreas()) {
-            // The inherited_value_of([start|end]-indent)
-            v = NumericOp.addition(v, propertyList.getInherited(baseMaker.propId).getNumeric());
-        }
-        // The corresponding absolute margin-[right|left}.
-        v = NumericOp.addition(v, margin);
-        v = NumericOp.addition(v, padding);
-        v = NumericOp.addition(v, border);
-        return (Property) v;
     }
     
     private boolean isInherited(PropertyList pList) {
@@ -166,7 +165,6 @@ public class IndentPropertyMaker extends CorrespondingPropertyMaker {
             pl = pl.getParentPropertyList();
         }
         
-        Numeric margin;
         // Calculate the absolute margin.
         if (propertyList.getExplicitOrShorthand(marginProp) == null) {
             Property indent = propertyList.getExplicit(baseMaker.propId);
@@ -181,19 +179,20 @@ public class IndentPropertyMaker extends CorrespondingPropertyMaker {
                 return indent;
             }
         } else {
-            margin = propertyList.get(marginProp).getNumeric();
-        }
-        
-        Numeric v = new FixedLength(0);
-        if (isInherited(propertyList)) {
-            // The inherited_value_of([start|end]-indent)
-            v = NumericOp.addition(v, propertyList.getInherited(baseMaker.propId).getNumeric());
+            //Margin is used
+            Numeric margin = propertyList.get(marginProp).getNumeric();
+            
+            Numeric v = new FixedLength(0);
+            if (isInherited(propertyList)) {
+                // The inherited_value_of([start|end]-indent)
+                v = NumericOp.addition(v, propertyList.getInherited(baseMaker.propId).getNumeric());
+            }
+            // The corresponding absolute margin-[right|left}.
+            v = NumericOp.addition(v, margin);
+            v = NumericOp.addition(v, padding);
+            v = NumericOp.addition(v, border);
+            return (Property) v;
         }
-        // The corresponding absolute margin-[right|left}.
-        v = NumericOp.addition(v, margin);
-        v = NumericOp.addition(v, padding);
-        v = NumericOp.addition(v, border);
-        return (Property) v;
     }
     
     private Property getCorresponding(int[] corresponding, PropertyList propertyList)
index dcb047d89adb3614b8770a8764a6876a1301f5cd..91afbd8c3b90c93db2ea98cf802b2e0b02bd65c0 100644 (file)
 
   <changes>
     <release version="FOP Trunk">
+      <action context="Code" dev="JM" type="fix">
+        Fixed a bug with indent handling when margins are used on a surrounding block and 
+        not start/end-indent.
+      </action>
       <action context="Code" dev="JM" type="add" fixes-bug="39777" due-to="Vincent Hennebert">
         Initial support for fo:float with float="before" and float="none".
       </action>
index 2a99e62fdc869961c00c922164a2bfd7913c14a6..b21d332a3e56cd4aec05d0651485c591b82ca9c7 100644 (file)
       </fo:layout-master-set>
       <fo:page-sequence master-reference="normal" white-space-collapse="true">
         <fo:flow flow-name="xsl-region-body">
+          <fo:block font-style="italic">Outer block with start-indent="10pt"</fo:block>
           <fo:block start-indent="10pt">
             <fo:block background-color="yellow">fo:block|fo:block</fo:block>
             <fo:block-container>
               <fo:block background-color="orange">fo:block|fo:block-container|fo:block</fo:block>
             </fo:block-container>
+            <fo:block-container start-indent="15pt" background-color="palegoldenrod" space-before="5pt">
+              <fo:block background-color="red">fo:block|fo:block-container|fo:block</fo:block>
+              <fo:block start-indent="0pt" background-color="red">fo:block|fo:block-container|fo:block start-indent="0pt"</fo:block>
+            </fo:block-container>
+          </fo:block>
+          <fo:block font-style="italic" space-before="10pt">Outer block with margin-left="10pt"</fo:block>
+          <fo:block margin-left="10pt">
+            <fo:block background-color="yellow">fo:block|fo:block</fo:block>
+            <fo:block-container>
+              <fo:block background-color="orange">fo:block|fo:block-container|fo:block</fo:block>
+            </fo:block-container>
+            <fo:block-container start-indent="15pt" background-color="palegoldenrod" space-before="5pt">
+              <fo:block background-color="red">fo:block|fo:block-container|fo:block</fo:block>
+              <fo:block start-indent="0pt" background-color="red">fo:block|fo:block-container|fo:block start-indent="0pt"</fo:block>
+            </fo:block-container>
           </fo:block>
         </fo:flow>
       </fo:page-sequence>
   </fo>
   <checks>
     <!-- Outer block with the start-indent property -->
-    <eval expected="10000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@start-indent"/>
-    <eval expected="10000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@space-start"/>
-    <eval expected="350000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@ipd"/>
-    <eval expected="350000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@ipda"/>
+    <eval expected="10000" xpath="//flow/block[2]/@start-indent"/>
+    <eval expected="10000" xpath="//flow/block[2]/@space-start"/>
+    <eval expected="350000" xpath="//flow/block[2]/@ipd"/>
+    <eval expected="350000" xpath="//flow/block[2]/@ipda"/>
     <!-- yellow block -->
-    <eval expected="10000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/@start-indent"/>
-    <eval expected="10000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/@space-start"/>
-    <eval expected="350000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/@ipd"/>
-    <eval expected="350000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/@ipda"/>
+    <eval expected="10000" xpath="//flow/block[2]/block[1]/@start-indent"/>
+    <eval expected="10000" xpath="//flow/block[2]/block[1]/@space-start"/>
+    <eval expected="350000" xpath="//flow/block[2]/block[1]/@ipd"/>
+    <eval expected="350000" xpath="//flow/block[2]/block[1]/@ipda"/>
     <!-- block-container -->
-    <eval expected="10000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/@start-indent"/>
-    <eval expected="10000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/@space-start"/>
-    <eval expected="350000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/@ipd"/>
-    <eval expected="350000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/@ipda"/>
+    <eval expected="10000" xpath="//flow/block[2]/block[2]/@start-indent"/>
+    <eval expected="10000" xpath="//flow/block[2]/block[2]/@space-start"/>
+    <eval expected="350000" xpath="//flow/block[2]/block[2]/@ipd"/>
+    <eval expected="350000" xpath="//flow/block[2]/block[2]/@ipda"/>
     <!-- block-container's reference area -->
-    <eval expected="350000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/block[1]/@ipd"/>
-    <eval expected="350000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/block[1]/@ipda"/>
+    <eval expected="350000" xpath="//flow/block[2]/block[2]/block[1]/@ipd"/>
+    <eval expected="350000" xpath="//flow/block[2]/block[2]/block[1]/@ipda"/>
     <!-- orange block inside the block-container -->
-    <eval expected="10000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/block[1]/block[1]/@start-indent"/>
-    <eval expected="10000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/block[1]/block[1]/@space-start"/>
-    <eval expected="340000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/block[1]/block[1]/@ipd"/>
-    <eval expected="340000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/block[1]/block[1]/@ipda"/>
+    <eval expected="10000" xpath="//flow/block[2]/block[2]/block[1]/block[1]/@start-indent"/>
+    <eval expected="10000" xpath="//flow/block[2]/block[2]/block[1]/block[1]/@space-start"/>
+    <eval expected="340000" xpath="//flow/block[2]/block[2]/block[1]/block[1]/@ipd"/>
+    <eval expected="340000" xpath="//flow/block[2]/block[2]/block[1]/block[1]/@ipda"/>
+    
+    <!-- block-container with start-indent -->
+    <eval expected="15000" xpath="//flow/block[2]/block[3]/@start-indent"/>
+    <eval expected="15000" xpath="//flow/block[2]/block[3]/@space-start"/>
+    <eval expected="345000" xpath="//flow/block[2]/block[3]/@ipd"/>
+    <!-- block-container's reference area -->
+    <eval expected="345000" xpath="//flow/block[2]/block[3]/block[1]/@ipd"/>
+    <!-- first red block inside the block-container -->
+    <eval expected="15000" xpath="//flow/block[2]/block[3]/block[1]/block[1]/@start-indent"/>
+    <eval expected="15000" xpath="//flow/block[2]/block[3]/block[1]/block[1]/@space-start"/>
+    <eval expected="330000" xpath="//flow/block[2]/block[3]/block[1]/block[1]/@ipd"/>
+    <!-- second red block inside the block-container -->
+    <true xpath="not(boolean(//flow/block[2]/block[3]/block[1]/block[2]/@start-indent))"/>
+    <true xpath="not(boolean(//flow/block[2]/block[3]/block[1]/block[2]/@space-indent))"/>
+    <eval expected="345000" xpath="//flow/block[2]/block[3]/block[1]/block[2]/@ipd"/>
+
+    <!-- === Same game with margin-left instead of start-indent on outer block === -->    
+    <!-- === This triggered an earlier bug.                                    === -->
+    <!-- Outer block with the start-indent property -->
+    <eval expected="10000" xpath="//flow/block[4]/@start-indent"/>
+    <eval expected="10000" xpath="//flow/block[4]/@space-start"/>
+    <eval expected="350000" xpath="//flow/block[4]/@ipd"/>
+    <eval expected="350000" xpath="//flow/block[4]/@ipda"/>
+    <!-- yellow block -->
+    <eval expected="10000" xpath="//flow/block[4]/block[1]/@start-indent"/>
+    <eval expected="10000" xpath="//flow/block[4]/block[1]/@space-start"/>
+    <eval expected="350000" xpath="//flow/block[4]/block[1]/@ipd"/>
+    <eval expected="350000" xpath="//flow/block[4]/block[1]/@ipda"/>
+    <!-- block-container -->
+    <eval expected="10000" xpath="//flow/block[4]/block[2]/@start-indent"/>
+    <eval expected="10000" xpath="//flow/block[4]/block[2]/@space-start"/>
+    <eval expected="350000" xpath="//flow/block[4]/block[2]/@ipd"/>
+    <eval expected="350000" xpath="//flow/block[4]/block[2]/@ipda"/>
+    <!-- block-container's reference area -->
+    <eval expected="350000" xpath="//flow/block[4]/block[2]/block[1]/@ipd"/>
+    <eval expected="350000" xpath="//flow/block[4]/block[2]/block[1]/@ipda"/>
+    <!-- orange block inside the block-container -->
+    <eval expected="10000" xpath="//flow/block[4]/block[2]/block[1]/block[1]/@start-indent"/>
+    <eval expected="10000" xpath="//flow/block[4]/block[2]/block[1]/block[1]/@space-start"/>
+    <eval expected="340000" xpath="//flow/block[4]/block[2]/block[1]/block[1]/@ipd"/>
+    <eval expected="340000" xpath="//flow/block[4]/block[2]/block[1]/block[1]/@ipda"/>
+    
+    <!-- block-container with start-indent -->
+    <eval expected="15000" xpath="//flow/block[4]/block[3]/@start-indent"/>
+    <eval expected="15000" xpath="//flow/block[4]/block[3]/@space-start"/>
+    <eval expected="345000" xpath="//flow/block[4]/block[3]/@ipd"/>
+    <!-- block-container's reference area -->
+    <eval expected="345000" xpath="//flow/block[4]/block[3]/block[1]/@ipd"/>
+    <!-- first red block inside the block-container -->
+    <eval expected="15000" xpath="//flow/block[4]/block[3]/block[1]/block[1]/@start-indent"/>
+    <eval expected="15000" xpath="//flow/block[4]/block[3]/block[1]/block[1]/@space-start"/>
+    <eval expected="330000" xpath="//flow/block[4]/block[3]/block[1]/block[1]/@ipd"/>
+    <!-- second red block inside the block-container -->
+    <true xpath="not(boolean(//flow/block[4]/block[3]/block[1]/block[2]/@start-indent))"/>
+    <true xpath="not(boolean(//flow/block[4]/block[3]/block[1]/block[2]/@space-indent))"/>
+    <eval expected="345000" xpath="//flow/block[4]/block[3]/block[1]/block[2]/@ipd"/>
   </checks>
 </testcase>