Author: lbernardo
Date: Mon Oct 20 09:09:56 2014
New Revision: 1633083
URL: http://svn.apache.org/r1633083
Log:
basic implementation of side floats
Added:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/SideFloat.java
(with props)
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java
(with props)
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/FloatLayoutManager.java
(with props)
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/layoutengine/standard-testcases/float_1.xml
(with props)
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/layoutengine/standard-testcases/float_2.xml
(with props)
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/layoutengine/standard-testcases/float_3.xml
(with props)
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/layoutengine/standard-testcases/float_4.xml
(with props)
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Area.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Block.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockParent.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockViewport.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/LineArea.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/InlineViewport.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/TextArea.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/flow/Float.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/KnuthBlockBox.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreaker.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/KnuthInlineBox.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/java/org/apache/fop/layoutengine/LayoutEngineTestCase.java
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Area.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Area.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Area.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Area.java
Mon Oct 20 09:09:56 2014
@@ -111,6 +111,8 @@ public class Area extends AreaTreeObject
/** the area's block-progression-dimension */
protected int bpd;
+ protected int effectiveIPD = -1;
+
/**
* Resolved bidirectional level for area.
*/
@@ -208,6 +210,10 @@ public class Area extends AreaTreeObject
return getBorderAndPaddingWidthStart() + getIPD() +
getBorderAndPaddingWidthEnd();
}
+ public int getEffectiveAllocIPD() {
+ return getBorderAndPaddingWidthStart() + getEffectiveIPD() +
getBorderAndPaddingWidthEnd();
+ }
+
/**
* Get the allocation block progression dimension of this area.
* This adds the content, borders, padding and spaces to find the
@@ -499,4 +505,14 @@ public class Area extends AreaTreeObject
sb.append("}");
return sb.toString();
}
+
+ public int getEffectiveIPD() {
+ return 0;
+ }
+
+ public void activateEffectiveIPD() {
+ if (effectiveIPD != -1) {
+ ipd = effectiveIPD;
+ }
+ }
}
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Block.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Block.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Block.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Block.java
Mon Oct 20 09:09:56 2014
@@ -184,5 +184,21 @@ public class Block extends BlockParent {
return location;
}
+ // maybe this can be done in the parent?
+ public int getEffectiveIPD() {
+ int eIPD = super.getEffectiveIPD();
+ if (eIPD != 0) {
+ effectiveIPD = eIPD;
+ }
+ return eIPD;
+ }
+
+ // maybe this can be done in the parent?
+ public void activateEffectiveIPD() {
+ super.activateEffectiveIPD();
+ if (effectiveIPD != -1) {
+ ipd = effectiveIPD;
+ }
+ }
}
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockParent.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockParent.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockParent.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockParent.java
Mon Oct 20 09:09:56 2014
@@ -123,4 +123,25 @@ public class BlockParent extends Area {
public int getYOffset() {
return yOffset;
}
+
+ public int getEffectiveIPD() {
+ int maxIPD = 0;
+ if (children != null) {
+ for (Area area : children) {
+ int effectiveIPD = area.getEffectiveIPD();
+ if (effectiveIPD > maxIPD) {
+ maxIPD = effectiveIPD;
+ }
+ }
+ }
+ return maxIPD;
+ }
+
+ public void activateEffectiveIPD() {
+ if (children != null) {
+ for (Area area : children) {
+ area.activateEffectiveIPD();
+ }
+ }
+ }
}
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockViewport.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockViewport.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockViewport.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockViewport.java
Mon Oct 20 09:09:56 2014
@@ -93,5 +93,9 @@ public class BlockViewport extends Block
return null;
}
}
+
+ public int getEffectiveIPD() {
+ return getIPD();
+ }
}
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/LineArea.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/LineArea.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/LineArea.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/LineArea.java
Mon Oct 20 09:09:56 2014
@@ -283,5 +283,19 @@ public class LineArea extends Area {
// been handled, modifying the line indent
}
}
+
+ public int getEffectiveIPD() {
+ int maxIPD = 0;
+ if (inlineAreas != null) {
+ for (Area area : inlineAreas) {
+ int effectiveIPD = area.getEffectiveIPD();
+ if (effectiveIPD > maxIPD) {
+ maxIPD = effectiveIPD;
+ }
+ }
+ }
+ return maxIPD;
+ }
+
}
Added:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/SideFloat.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/SideFloat.java?rev=1633083&view=auto
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/SideFloat.java
(added)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/SideFloat.java
Mon Oct 20 09:09:56 2014
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.area;
+
+public class SideFloat extends Block {
+
+ private static final long serialVersionUID = 2058594336594375047L;
+
+ public SideFloat() {
+ setAreaClass(Area.CLASS_SIDE_FLOAT);
+ addTrait(Trait.IS_REFERENCE_AREA, Boolean.TRUE);
+ setPositioning(Block.ABSOLUTE);
+ }
+}
Propchange:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/SideFloat.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/InlineViewport.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/InlineViewport.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/InlineViewport.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/InlineViewport.java
Mon Oct 20 09:09:56 2014
@@ -149,4 +149,7 @@ public class InlineViewport extends Inli
this.content = (Area) in.readObject();
}
+ public int getEffectiveIPD() {
+ return getIPD();
+ }
}
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/TextArea.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/TextArea.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/TextArea.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/TextArea.java
Mon Oct 20 09:09:56 2014
@@ -209,5 +209,8 @@ public class TextArea extends AbstractTe
}
}
+ public int getEffectiveIPD() {
+ return getIPD();
+ }
}
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java
Mon Oct 20 09:09:56 2014
@@ -23,6 +23,7 @@ import java.util.List;
import java.util.Stack;
import org.apache.fop.fo.flow.Block;
+import org.apache.fop.fo.flow.Float;
import org.apache.fop.util.CharUtilities;
/**
@@ -157,6 +158,10 @@ public class XMLWhiteSpaceHandler {
charIter = new RecursiveCharIterator(fo, firstTextNode);
inWhiteSpace = false;
+ if (firstTextNode.siblings != null && firstTextNode.siblings[0] != null
+ && firstTextNode.siblings[0].getNameId() ==
Constants.FO_FLOAT) {
+ inWhiteSpace = ((Float)
firstTextNode.siblings[0]).getInWhiteSpace();
+ }
if (fo == currentBlock
|| currentBlock == null
@@ -232,6 +237,9 @@ public class XMLWhiteSpaceHandler {
firstWhiteSpaceInSeq = null;
}
}
+ if (nextChild instanceof Float) {
+ ((Float) nextChild).setInWhiteSpace(inWhiteSpace);
+ }
}
/**
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/flow/Float.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/flow/Float.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/flow/Float.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/flow/Float.java
Mon Oct 20 09:09:56 2014
@@ -34,11 +34,10 @@ import org.apache.fop.fo.ValidationExcep
*/
public class Float extends FObj {
// The value of properties relevant for fo:float (commented out for
performance.
- // private int float_;
- // private int clear;
+ private int foFloat;
+ private int clear;
// End of property values
-
- private static boolean notImplementedWarningGiven;
+ private boolean inWhiteSpace;
/**
* Base constructor
@@ -47,17 +46,13 @@ public class Float extends FObj {
*/
public Float(FONode parent) {
super(parent);
-
- if (!notImplementedWarningGiven) {
- getFOValidationEventProducer().unimplementedFeature(this,
getName(),
- getName(), getLocator());
- notImplementedWarningGiven = true;
- }
}
/** {@inheritDoc} */
public void bind(PropertyList pList) throws FOPException {
- // No active properties -> Nothing to do.
+ super.bind(pList);
+ foFloat = pList.get(PR_FLOAT).getEnum();
+ clear = pList.get(PR_CLEAR).getEnum();
}
/**
@@ -92,4 +87,16 @@ public class Float extends FObj {
public int getNameId() {
return FO_FLOAT;
}
+
+ public int getFloat() {
+ return foFloat;
+ }
+
+ public void setInWhiteSpace(boolean iws) {
+ inWhiteSpace = iws;
+ }
+
+ public boolean getInWhiteSpace() {
+ return inWhiteSpace;
+ }
}
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java
Mon Oct 20 09:09:56 2014
@@ -67,6 +67,17 @@ public abstract class AbstractBreaker {
}
}
+ public static class FloatPosition extends LeafPosition {
+ double bpdAdjust; // Percentage to adjust (stretch or shrink)
+ int difference;
+
+ FloatPosition(LayoutManager lm, int breakIndex, double bpdA, int diff)
{
+ super(lm, breakIndex);
+ bpdAdjust = bpdA;
+ difference = diff;
+ }
+ }
+
/**
* Helper method, mainly used to improve debug/trace output
* @param breakClassId the {@link Constants} enum value.
@@ -195,9 +206,12 @@ public abstract class AbstractBreaker {
}
// used by doLayout and getNextBlockList*
- private List<BlockSequence> blockLists;
+ protected List<BlockSequence> blockLists;
private boolean empty = true;
+ /** blockListIndex of the current BlockSequence in blockLists */
+ protected int blockListIndex;
+
/** desired text alignment */
protected int alignment;
@@ -372,7 +386,7 @@ public abstract class AbstractBreaker {
//*** Phases 2 and 3 ***
log.debug("PLM> blockLists.size() = " + blockLists.size());
- for (int blockListIndex = 0; blockListIndex < blockLists.size();
blockListIndex++) {
+ for (blockListIndex = 0; blockListIndex < blockLists.size();
blockListIndex++) {
blockList = blockLists.get(blockListIndex);
//debug code start
@@ -394,7 +408,10 @@ public abstract class AbstractBreaker {
alg.setConstantLineWidth(flowBPD);
int optimalPageCount = alg.findBreakingPoints(blockList, 1,
true,
BreakingAlgorithm.ALL_BREAKS);
- if (Math.abs(alg.getIPDdifference()) > 1) {
+
+ if (alg.handlingFloat()) {
+ nextSequenceStartsOn = handleFloatLayout(alg,
optimalPageCount, blockList, childLC);
+ } else if (Math.abs(alg.getIPDdifference()) > 1) {
addAreas(alg, optimalPageCount, blockList, blockList);
// *** redo Phase 1 ***
log.trace("IPD changes after page " + optimalPageCount);
@@ -476,14 +493,14 @@ public abstract class AbstractBreaker {
for (int p = startPart; p < startPart + partCount; p++) {
PageBreakPosition pbp = alg.getPageBreaks().get(p);
- //Check the last break position for forced breaks
+ // Check the last break position for forced breaks
int lastBreakClass;
if (p == 0) {
lastBreakClass = effectiveList.getStartOn();
} else {
ListElement lastBreakElement =
effectiveList.getElement(endElementIndex);
if (lastBreakElement.isPenalty()) {
- KnuthPenalty pen = (KnuthPenalty)lastBreakElement;
+ KnuthPenalty pen = (KnuthPenalty) lastBreakElement;
if (pen.getPenalty() == KnuthPenalty.INFINITE) {
/**
* That means that there was a
keep.within-page="always", but that
@@ -500,14 +517,12 @@ public abstract class AbstractBreaker {
}
}
- //the end of the new part
+ // the end of the new part
endElementIndex = pbp.getLeafPos();
// ignore the first elements added by the
// PageSequenceLayoutManager
- startElementIndex += (startElementIndex == 0)
- ? effectiveList.ignoreAtStart
- : 0;
+ startElementIndex += (startElementIndex == 0) ?
effectiveList.ignoreAtStart : 0;
log.debug("PLM> part: " + (p + 1)
+ ", start at pos " + startElementIndex
@@ -518,20 +533,17 @@ public abstract class AbstractBreaker {
int displayAlign = getCurrentDisplayAlign();
- //The following is needed by
SpaceResolver.performConditionalsNotification()
- //further down as there may be important Position elements in the
element list trailer
+ // The following is needed by
SpaceResolver.performConditionalsNotification()
+ // further down as there may be important Position elements in the
element list trailer
int notificationEndElementIndex = endElementIndex;
// ignore the last elements added by the
// PageSequenceLayoutManager
- endElementIndex -= (endElementIndex == (originalList.size() - 1))
- ? effectiveList.ignoreAtEnd
- : 0;
+ endElementIndex -= (endElementIndex == (originalList.size() - 1))
? effectiveList.ignoreAtEnd : 0;
// ignore the last element in the page if it is a KnuthGlue
// object
- if (((KnuthElement) effectiveList.get(endElementIndex))
- .isGlue()) {
+ if (((KnuthElement) effectiveList.get(endElementIndex)).isGlue()) {
endElementIndex--;
}
@@ -556,13 +568,12 @@ public abstract class AbstractBreaker {
}
// Handle SpaceHandling(Break)Positions, see SpaceResolver!
- SpaceResolver.performConditionalsNotification(effectiveList,
- startElementIndex, notificationEndElementIndex,
lastBreak);
+ SpaceResolver.performConditionalsNotification(effectiveList,
startElementIndex,
+ notificationEndElementIndex, lastBreak);
// Add areas now!
- addAreas(new KnuthPossPosIter(effectiveList,
- startElementIndex, endElementIndex + 1), childLC);
+ addAreas(new KnuthPossPosIter(effectiveList,
startElementIndex, endElementIndex + 1), childLC);
} else {
- //no content for this part
+ // no content for this part
handleEmptyContent();
}
@@ -571,6 +582,10 @@ public abstract class AbstractBreaker {
lastBreak = endElementIndex;
startElementIndex = pbp.getLeafPos() + 1;
}
+ if (alg.handlingFloat()) {
+ addAreasForFloats(alg, startPart, partCount, originalList,
effectiveList, childLC, lastBreak,
+ startElementIndex, endElementIndex);
+ }
}
/**
* Notifies the layout managers about the space and conditional length
situation based on
@@ -774,4 +789,14 @@ public abstract class AbstractBreaker {
return nextSequenceStartsOn;
}
+ protected int handleFloatLayout(PageBreakingAlgorithm alg, int
optimalPageCount, BlockSequence blockList,
+ LayoutContext childLC) {
+ throw new IllegalStateException();
+ }
+
+ protected void addAreasForFloats(PageBreakingAlgorithm alg, int startPart,
int partCount,
+ BlockSequence originalList, BlockSequence effectiveList, final
LayoutContext childLC,
+ int lastBreak, int startElementIndex, int endElementIndex) {
+ throw new IllegalStateException();
+ }
}
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java
Mon Oct 20 09:09:56 2014
@@ -537,4 +537,11 @@ public abstract class AbstractLayoutMana
}
((AbstractLayoutManager) lm).possiblyRegisterMarkersForTables(markers,
isStarting, isFirst, isLast);
}
+
+ public boolean handlingFloat() {
+ if (parentLayoutManager != null && parentLayoutManager instanceof
AbstractLayoutManager) {
+ return ((AbstractLayoutManager)
parentLayoutManager).handlingFloat();
+ }
+ return false;
+ }
}
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java
Mon Oct 20 09:09:56 2014
@@ -558,6 +558,9 @@ public abstract class BreakingAlgorithm
elementIndex, previousIsBox, allowedBreaks).isBox();
if (activeNodeCount == 0) {
+ if (handlingFloat()) {
+ return handleFloat();
+ }
if (getIPDdifference() != 0) {
return handleIpdChange();
}
@@ -945,8 +948,11 @@ public abstract class BreakingAlgorithm
log.trace("\tline=" + line);
}
+ if (element.isForcedBreak() && handlingFloat()) {
+ disableFloatHandling(); // so that we do not create a
float edge position later
+ }
// The line would be too long.
- if (r < -1 || element.isForcedBreak()) {
+ if (r < -1 || element.isForcedBreak() || handlingFloat()) {
deactivateNode(node, line);
}
@@ -1028,6 +1034,13 @@ public abstract class BreakingAlgorithm
}
}
+ createForcedNodes(node, line, elementIdx, difference, r, demerits,
fitnessClass, availableShrink,
+ availableStretch, newWidth, newStretch, newShrink);
+ }
+
+ protected void createForcedNodes(KnuthNode node, int line, int elementIdx,
int difference, double r,
+ double demerits, int fitnessClass, int availableShrink, int
availableStretch, int newWidth,
+ int newStretch, int newShrink) {
if (r <= -1) {
log.debug("Considering tooLong, demerits=" + demerits);
if (lastTooLong == null || demerits < lastTooLong.totalDemerits) {
@@ -1042,10 +1055,9 @@ public abstract class BreakingAlgorithm
} else {
if (lastTooShort == null || demerits <=
lastTooShort.totalDemerits) {
if (considerTooShort) {
- //consider possibilities which are too short
- best.addRecord(demerits, node, r,
- availableShrink, availableStretch,
- difference, fitnessClass);
+ // consider possibilities which are too short
+ best.addRecord(demerits, node, r, availableShrink,
availableStretch, difference,
+ fitnessClass);
}
lastTooShort = createNode(elementIdx, line + 1, fitnessClass,
newWidth, newStretch, newShrink,
@@ -1451,4 +1463,15 @@ public abstract class BreakingAlgorithm
return this.alignmentLast;
}
+ protected boolean handlingFloat() {
+ return false;
+ }
+
+ protected int handleFloat() {
+ throw new IllegalStateException();
+ }
+
+ protected void disableFloatHandling() {
+ throw new IllegalStateException();
+ }
}
Added:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java?rev=1633083&view=auto
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java
(added)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java
Mon Oct 20 09:09:56 2014
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.layoutmgr;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.ListIterator;
+
+import org.apache.fop.area.Area;
+import org.apache.fop.area.SideFloat;
+import org.apache.fop.fo.Constants;
+import org.apache.fop.fo.flow.Float;
+import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
+import org.apache.fop.layoutmgr.inline.FloatLayoutManager;
+import org.apache.fop.layoutmgr.inline.KnuthInlineBox;
+
+public class FloatContentLayoutManager extends
SpacedBorderedPaddedBlockLayoutManager {
+
+ private SideFloat floatContentArea;
+ private int side;
+ private int yOffset;
+
+ public FloatContentLayoutManager(Float node) {
+ super(node);
+ generatesReferenceArea = true;
+ side = node.getFloat();
+ }
+
+ public Keep getKeepTogether() {
+ return getParentKeepTogether();
+ }
+
+ public Keep getKeepWithNext() {
+ return Keep.KEEP_AUTO;
+ }
+
+ public Keep getKeepWithPrevious() {
+ return Keep.KEEP_ALWAYS;
+ }
+
+ public void addAreas(PositionIterator parentIter, LayoutContext
layoutContext) {
+ floatContentArea = new SideFloat();
+ AreaAdditionUtil.addAreas(this, parentIter, layoutContext);
+ flush();
+ }
+
+ public void addChildArea(Area childArea) {
+ floatContentArea.addChildArea(childArea);
+ floatContentArea.setBPD(childArea.getAllocBPD());
+ int effectiveContentIPD = childArea.getEffectiveAllocIPD();
+ int contentIPD = childArea.getIPD();
+ int xOffset = childArea.getBorderAndPaddingWidthStart();
+ floatContentArea.setIPD(effectiveContentIPD);
+ childArea.activateEffectiveIPD();
+ if (side == Constants.EN_END || side == Constants.EN_RIGHT) {
+ floatContentArea.setXOffset(xOffset + contentIPD -
effectiveContentIPD);
+ } else if (side == Constants.EN_START || side == Constants.EN_LEFT) {
+ floatContentArea.setXOffset(xOffset);
+ }
+ LayoutManager lm = parentLayoutManager;
+ while (!lm.getGeneratesReferenceArea()) {
+ lm = lm.getParent();
+ }
+ yOffset = lm.getParentArea(floatContentArea).getBPD();
+ lm.addChildArea(floatContentArea);
+ if (side == Constants.EN_END || side == Constants.EN_RIGHT) {
+ lm.getPSLM().setEndIntrusionAdjustment(effectiveContentIPD);
+ } else if (side == Constants.EN_START || side == Constants.EN_LEFT) {
+ lm.getPSLM().setStartIntrusionAdjustment(effectiveContentIPD);
+ }
+ }
+
+ public static List<FloatContentLayoutManager>
checkForFloats(List<ListElement> elemenList,
+ int startIndex, int endIndex) {
+ ListIterator<ListElement> iter = elemenList.listIterator(startIndex);
+ List<FloatContentLayoutManager> floats = new
ArrayList<FloatContentLayoutManager>();
+ while (iter.nextIndex() <= endIndex) {
+ ListElement element = iter.next();
+ if (element instanceof KnuthInlineBox && ((KnuthInlineBox)
element).isFloatAnchor()) {
+ floats.add(((KnuthInlineBox) element).getFloatContentLM());
+ } else if (element instanceof KnuthBlockBox && ((KnuthBlockBox)
element).hasFloatAnchors()) {
+ floats.addAll(((KnuthBlockBox) element).getFloatContentLMs());
+ }
+ }
+ if (floats.isEmpty()) {
+ return Collections.emptyList();
+ } else {
+ return floats;
+ }
+ }
+
+ protected CommonBorderPaddingBackground getCommonBorderPaddingBackground()
{
+ return null;
+ }
+
+ public void processAreas(LayoutContext layoutContext) {
+ if (getParent() instanceof FloatLayoutManager) {
+ FloatLayoutManager flm = (FloatLayoutManager) getParent();
+ flm.processAreas(layoutContext);
+ }
+ }
+
+ public int getFloatHeight() {
+ return floatContentArea.getAllocBPD();
+ }
+
+ public int getFloatYOffset() {
+ return yOffset;
+ }
+}
Propchange:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java
Mon Oct 20 09:09:56 2014
@@ -49,6 +49,8 @@ public class FlowLayoutManager extends B
/** Array of areas currently being filled stored by area class */
private final BlockParent[] currentAreas = new BlockParent[Area.CLASS_MAX];
+ private boolean handlingFloat;
+
/**
* This is the top level layout manager.
* It is created by the PageSequence FO.
@@ -374,6 +376,10 @@ public class FlowLayoutManager extends B
*/
@Override
public void addChildArea(Area childArea) {
+ if (childArea instanceof BlockParent && handlingFloat()) {
+ BlockParent bp = (BlockParent) childArea;
+ bp.setXOffset(getPSLM().getStartIntrusionAdjustment());
+ }
getParentArea(childArea);
addChildToArea(childArea,
this.currentAreas[childArea.getAreaClass()]);
@@ -385,7 +391,7 @@ public class FlowLayoutManager extends B
BlockParent parentArea = null;
int aclass = childArea.getAreaClass();
- if (aclass == Area.CLASS_NORMAL) {
+ if (aclass == Area.CLASS_NORMAL || aclass == Area.CLASS_SIDE_FLOAT) {
parentArea = getCurrentPV().getCurrentFlow();
} else if (aclass == Area.CLASS_BEFORE_FLOAT) {
parentArea = getCurrentPV().getBodyRegion().getBeforeFloat();
@@ -407,7 +413,8 @@ public class FlowLayoutManager extends B
*/
@Override
public int getContentAreaIPD() {
- return getCurrentPV().getCurrentSpan().getColumnWidth();
+ int flowIPD = getPSLM().getCurrentColumnWidth();
+ return flowIPD;
}
/**
@@ -425,5 +432,16 @@ public class FlowLayoutManager extends B
return true;
}
+ public void handleFloatOn() {
+ handlingFloat = true;
+ }
+
+ public void handleFloatOff() {
+ handlingFloat = false;
+ }
+
+ public boolean handlingFloat() {
+ return handlingFloat;
+ }
}
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/KnuthBlockBox.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/KnuthBlockBox.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/KnuthBlockBox.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/KnuthBlockBox.java
Mon Oct 20 09:09:56 2014
@@ -36,6 +36,7 @@ public class KnuthBlockBox extends Knuth
*/
private int bpd;
private List<FootnoteBodyLayoutManager> footnoteList;
+ private List<FloatContentLayoutManager> floatContentLMs;
/** List of Knuth elements. This is a list of LinkedList elements. */
private List elementLists;
@@ -53,6 +54,7 @@ public class KnuthBlockBox extends Knuth
ipdRange = range;
bpd = bpdim;
footnoteList = new LinkedList<FootnoteBodyLayoutManager>();
+ floatContentLMs = new LinkedList<FloatContentLayoutManager>();
}
/**
@@ -69,6 +71,16 @@ public class KnuthBlockBox extends Knuth
ipdRange = MinOptMax.ZERO;
bpd = 0;
footnoteList = new LinkedList<FootnoteBodyLayoutManager>(list);
+ floatContentLMs = new LinkedList<FloatContentLayoutManager>();
+ }
+
+ public KnuthBlockBox(int width, List list, Position pos, boolean auxiliary,
+ List<FloatContentLayoutManager> fclms) {
+ super(width, pos, auxiliary);
+ ipdRange = MinOptMax.ZERO;
+ bpd = 0;
+ footnoteList = new LinkedList<FootnoteBodyLayoutManager>(list);
+ floatContentLMs = new LinkedList<FloatContentLayoutManager>(fclms);
}
/**
@@ -122,4 +134,12 @@ public class KnuthBlockBox extends Knuth
public int getBPD() {
return bpd;
}
+
+ public List<FloatContentLayoutManager> getFloatContentLMs() {
+ return floatContentLMs;
+ }
+
+ public boolean hasFloatAnchors() {
+ return (floatContentLMs.size() > 0);
+ }
}
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java
Mon Oct 20 09:09:56 2014
@@ -41,6 +41,7 @@ import org.apache.fop.fo.flow.Block;
import org.apache.fop.fo.flow.BlockContainer;
import org.apache.fop.fo.flow.Character;
import org.apache.fop.fo.flow.ExternalGraphic;
+import org.apache.fop.fo.flow.Float;
import org.apache.fop.fo.flow.Footnote;
import org.apache.fop.fo.flow.Inline;
import org.apache.fop.fo.flow.InlineContainer;
@@ -74,6 +75,7 @@ import org.apache.fop.layoutmgr.inline.B
import org.apache.fop.layoutmgr.inline.CharacterLayoutManager;
import org.apache.fop.layoutmgr.inline.ContentLayoutManager;
import org.apache.fop.layoutmgr.inline.ExternalGraphicLayoutManager;
+import org.apache.fop.layoutmgr.inline.FloatLayoutManager;
import org.apache.fop.layoutmgr.inline.FootnoteLayoutManager;
import org.apache.fop.layoutmgr.inline.InlineContainerLayoutManager;
import org.apache.fop.layoutmgr.inline.InlineLayoutManager;
@@ -113,7 +115,7 @@ public class LayoutManagerMapping implem
registerMaker(FObjMixed.class, new Maker());
registerMaker(BidiOverride.class, new
BidiOverrideLayoutManagerMaker());
registerMaker(Inline.class, new InlineLayoutManagerMaker());
- registerMaker(Footnote.class, new FootnodeLayoutManagerMaker());
+ registerMaker(Footnote.class, new FootnoteLayoutManagerMaker());
registerMaker(InlineContainer.class,
new InlineContainerLayoutManagerMaker());
registerMaker(BasicLink.class, new BasicLinkLayoutManagerMaker());
@@ -146,6 +148,7 @@ public class LayoutManagerMapping implem
registerMaker(Title.class, new InlineLayoutManagerMaker());
registerMaker(MultiCase.class, new MultiCaseLayoutManagerMaker());
registerMaker(MultiSwitch.class, new MultiSwitchLayoutManagerMaker());
+ registerMaker(Float.class, new FloatLayoutManagerMaker());
}
/**
@@ -267,7 +270,7 @@ public class LayoutManagerMapping implem
}
/** a layout manager maker */
- public static class FootnodeLayoutManagerMaker extends Maker {
+ public static class FootnoteLayoutManagerMaker extends Maker {
/** {@inheritDoc} */
public void make(FONode node, List lms) {
lms.add(new FootnoteLayoutManager((Footnote) node));
@@ -463,4 +466,10 @@ public class LayoutManagerMapping implem
}
}
+ public static class FloatLayoutManagerMaker extends Maker {
+ public void make(FONode node, List lms) {
+ lms.add(new FloatLayoutManager((Float) node));
+ }
+ }
+
}
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreaker.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreaker.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreaker.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreaker.java
Mon Oct 20 09:09:56 2014
@@ -20,6 +20,8 @@
package org.apache.fop.layoutmgr;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
@@ -32,6 +34,7 @@ import org.apache.fop.fo.FObj;
import org.apache.fop.fo.pagination.Region;
import org.apache.fop.fo.pagination.RegionBody;
import org.apache.fop.fo.pagination.StaticContent;
+import org.apache.fop.layoutmgr.BreakingAlgorithm.KnuthNode;
import
org.apache.fop.layoutmgr.PageBreakingAlgorithm.PageBreakingLayoutListener;
import org.apache.fop.traits.MinOptMax;
@@ -47,6 +50,10 @@ public class PageBreaker extends Abstrac
private PageProvider pageProvider;
private Block separatorArea;
private boolean spanAllActive;
+ private boolean handlingStartOfFloat;
+ private boolean handlingEndOfFloat;
+ private int floatHeight;
+ private int floatYOffset;
/**
* The FlowLayoutManager object, which processes
@@ -69,7 +76,7 @@ public class PageBreaker extends Abstrac
/** {@inheritDoc} */
protected void updateLayoutContext(LayoutContext context) {
- int flowIPD = pslm.getCurrentPV().getCurrentSpan().getColumnWidth();
+ int flowIPD = pslm.getCurrentColumnWidth();
context.setRefIPD(flowIPD);
}
@@ -140,18 +147,20 @@ public class PageBreaker extends Abstrac
/** {@inheritDoc} */
protected int getNextBlockList(LayoutContext childLC, int
nextSequenceStartsOn,
Position positionAtIPDChange, LayoutManager restartLM, List
firstElements) {
- if (!firstPart) {
- // if this is the first page that will be created by
- // the current BlockSequence, it could have a break
- // condition that must be satisfied;
- // otherwise, we may simply need a new page
- handleBreakTrait(nextSequenceStartsOn);
- }
- firstPart = false;
- pageBreakHandled = true;
+ if (!handlingFloat()) {
+ if (!firstPart) {
+ // if this is the first page that will be created by
+ // the current BlockSequence, it could have a break
+ // condition that must be satisfied;
+ // otherwise, we may simply need a new page
+ handleBreakTrait(nextSequenceStartsOn);
+ }
+ firstPart = false;
+ pageBreakHandled = true;
- pageProvider.setStartOfNextElementList(pslm.getCurrentPageNum(),
- pslm.getCurrentPV().getCurrentSpan().getCurrentFlowIndex(),
this.spanAllActive);
+ pageProvider.setStartOfNextElementList(pslm.getCurrentPageNum(),
pslm.getCurrentPV()
+ .getCurrentSpan().getCurrentFlowIndex(),
this.spanAllActive);
+ }
return super.getNextBlockList(childLC, nextSequenceStartsOn,
positionAtIPDChange,
restartLM, firstElements);
}
@@ -234,6 +243,7 @@ public class PageBreaker extends Abstrac
// handle the footnote separator
handleFootnoteSeparator();
}
+
return contentList;
}
@@ -616,4 +626,194 @@ public class PageBreaker extends Abstrac
return true;
}
}
+
+ protected boolean handlingStartOfFloat() {
+ return handlingStartOfFloat;
+ }
+
+ protected void handleStartOfFloat(int fHeight, int fYOffset) {
+ handlingStartOfFloat = true;
+ handlingEndOfFloat = false;
+ floatHeight = fHeight;
+ floatYOffset = fYOffset;
+ childFLM.handleFloatOn();
+ }
+
+ protected int getFloatHeight() {
+ return floatHeight;
+ }
+
+ protected int getFloatYOffset() {
+ return floatYOffset;
+ }
+
+ protected boolean handlingEndOfFloat() {
+ return handlingEndOfFloat;
+ }
+
+ protected void handleEndOfFloat(int fHeight) {
+ handlingEndOfFloat = true;
+ handlingStartOfFloat = false;
+ floatHeight = fHeight;
+ childFLM.handleFloatOff();
+ }
+
+ protected boolean handlingFloat() {
+ return (handlingStartOfFloat || handlingEndOfFloat);
+ }
+
+ public int getOffsetDueToFloat() {
+ handlingEndOfFloat = false;
+ return floatHeight + floatYOffset;
+ }
+
+ protected int handleFloatLayout(PageBreakingAlgorithm alg, int
optimalPageCount, BlockSequence blockList,
+ LayoutContext childLC) {
+ pageBreakHandled = true;
+ List firstElements = Collections.EMPTY_LIST;
+ KnuthNode floatNode = alg.getBestFloatEdgeNode();
+ int floatPosition = floatNode.position;
+ KnuthElement floatElem = alg.getElement(floatPosition);
+ Position positionAtBreak = floatElem.getPosition();
+ if (!(positionAtBreak instanceof
SpaceResolver.SpaceHandlingBreakPosition)) {
+ throw new UnsupportedOperationException("Don't know how to restart
at position" + positionAtBreak);
+ }
+ /* Retrieve the original position wrapped into this space position */
+ positionAtBreak = positionAtBreak.getPosition();
+ addAreas(alg, optimalPageCount, blockList, blockList);
+ blockLists.clear();
+ blockListIndex = -1;
+ LayoutManager restartAtLM = null;
+ if (positionAtBreak != null && positionAtBreak.getIndex() == -1) {
+ Position position;
+ Iterator iter = blockList.listIterator(floatPosition + 1);
+ do {
+ KnuthElement nextElement = (KnuthElement) iter.next();
+ position = nextElement.getPosition();
+ } while (position == null || position instanceof
SpaceResolver.SpaceHandlingPosition
+ || position instanceof
SpaceResolver.SpaceHandlingBreakPosition
+ && position.getPosition().getIndex() == -1);
+ LayoutManager surroundingLM = positionAtBreak.getLM();
+ while (position.getLM() != surroundingLM) {
+ position = position.getPosition();
+ }
+ restartAtLM = position.getPosition().getLM();
+ }
+ int nextSequenceStartsOn = getNextBlockList(childLC,
Constants.EN_COLUMN, positionAtBreak,
+ restartAtLM, firstElements);
+ return nextSequenceStartsOn;
+ }
+
+ protected void addAreasForFloats(PageBreakingAlgorithm alg, int startPart,
int partCount,
+ BlockSequence originalList, BlockSequence effectiveList, final
LayoutContext childLC,
+ int lastBreak, int startElementIndex, int endElementIndex) {
+ FloatPosition pbp = alg.getFloatPosition();
+
+ // Check the last break position for forced breaks
+ int lastBreakClass;
+ if (startElementIndex == 0) {
+ lastBreakClass = effectiveList.getStartOn();
+ } else {
+ ListElement lastBreakElement =
effectiveList.getElement(endElementIndex);
+ if (lastBreakElement.isPenalty()) {
+ KnuthPenalty pen = (KnuthPenalty) lastBreakElement;
+ if (pen.getPenalty() == KnuthPenalty.INFINITE) {
+ /**
+ * That means that there was a keep.within-page="always",
but that
+ * it's OK to break at a column. TODO The break class is
being
+ * abused to implement keep.within-column and
keep.within-page.
+ * This is very misleading and must be revised.
+ */
+ lastBreakClass = Constants.EN_COLUMN;
+ } else {
+ lastBreakClass = pen.getBreakClass();
+ }
+ } else {
+ lastBreakClass = Constants.EN_COLUMN;
+ }
+ }
+
+ // the end of the new part
+ endElementIndex = pbp.getLeafPos();
+
+ // ignore the first elements added by the
+ // PageSequenceLayoutManager
+ startElementIndex += (startElementIndex == 0) ?
effectiveList.ignoreAtStart : 0;
+
+ log.debug("PLM> part: " + (startPart + partCount + 1) + ", start at
pos " + startElementIndex
+ + ", break at pos " + endElementIndex + ", break class = "
+ + getBreakClassName(lastBreakClass));
+
+ startPart(effectiveList, lastBreakClass);
+
+ int displayAlign = getCurrentDisplayAlign();
+
+ // The following is needed by
SpaceResolver.performConditionalsNotification()
+ // further down as there may be important Position elements in the
element list trailer
+ int notificationEndElementIndex = endElementIndex;
+
+ // ignore the last elements added by the
+ // PageSequenceLayoutManager
+ endElementIndex -= (endElementIndex == (originalList.size() - 1)) ?
effectiveList.ignoreAtEnd : 0;
+
+ // ignore the last element in the page if it is a KnuthGlue
+ // object
+ if (((KnuthElement) effectiveList.get(endElementIndex)).isGlue()) {
+ endElementIndex--;
+ }
+
+ // ignore KnuthGlue and KnuthPenalty objects
+ // at the beginning of the line
+ startElementIndex = alg.par.getFirstBoxIndex(startElementIndex);
+
+ if (startElementIndex <= endElementIndex) {
+ if (log.isDebugEnabled()) {
+ log.debug(" addAreas from " + startElementIndex + " to " +
endElementIndex);
+ }
+ // set the space adjustment ratio
+ childLC.setSpaceAdjust(pbp.bpdAdjust);
+ // add space before if display-align is center or bottom
+ // add space after if display-align is distribute and
+ // this is not the last page
+ if (pbp.difference != 0 && displayAlign == Constants.EN_CENTER) {
+ childLC.setSpaceBefore(pbp.difference / 2);
+ } else if (pbp.difference != 0 && displayAlign ==
Constants.EN_AFTER) {
+ childLC.setSpaceBefore(pbp.difference);
+ }
+
+ // Handle SpaceHandling(Break)Positions, see SpaceResolver!
+ SpaceResolver.performConditionalsNotification(effectiveList,
startElementIndex,
+ notificationEndElementIndex, lastBreak);
+ // Add areas of lines, in the current page, before the float or
during float
+ addAreas(new KnuthPossPosIter(effectiveList, startElementIndex,
endElementIndex + 1), childLC);
+ // add areas for the float, if applicable
+ if (alg.handlingStartOfFloat()) {
+ for (int k = startElementIndex; k < endElementIndex + 1; k++) {
+ ListElement le = effectiveList.getElement(k);
+ if (le instanceof KnuthBlockBox) {
+ KnuthBlockBox kbb = (KnuthBlockBox) le;
+ for (FloatContentLayoutManager fclm :
kbb.getFloatContentLMs()) {
+ fclm.processAreas(childLC);
+ int floatHeight = fclm.getFloatHeight();
+ int floatYOffset = fclm.getFloatYOffset();
+ PageSequenceLayoutManager pslm =
(PageSequenceLayoutManager) getTopLevelLM();
+ pslm.recordStartOfFloat(floatHeight, floatYOffset);
+ }
+ }
+ }
+ }
+ if (alg.handlingEndOfFloat()) {
+ PageSequenceLayoutManager pslm = (PageSequenceLayoutManager)
getTopLevelLM();
+ pslm.setEndIntrusionAdjustment(0);
+ pslm.setStartIntrusionAdjustment(0);
+ int effectiveFloatHeight = alg.getFloatHeight();
+ pslm.recordEndOfFloat(effectiveFloatHeight);
+ }
+ } else {
+ // no content for this part
+ handleEmptyContent();
+ }
+
+ pageBreakHandled = true;
+ }
}
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java
Mon Oct 20 09:09:56 2014
@@ -29,7 +29,9 @@ import org.apache.commons.logging.LogFac
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.FObj;
+import org.apache.fop.layoutmgr.AbstractBreaker.FloatPosition;
import org.apache.fop.layoutmgr.AbstractBreaker.PageBreakPosition;
+import org.apache.fop.layoutmgr.BreakingAlgorithm.KnuthNode;
import org.apache.fop.layoutmgr.WhitespaceManagementPenalty.Variant;
import org.apache.fop.traits.MinOptMax;
import org.apache.fop.util.ListUtil;
@@ -99,6 +101,14 @@ class PageBreakingAlgorithm extends Brea
private int currentKeepContext = Constants.EN_AUTO;
private KnuthNode lastBeforeKeepContextSwitch;
+ // just one float for now...
+ private boolean handlingStartOfFloat;
+ private boolean handlingEndOfFloat;
+ private int floatYOffset;
+ private int floatHeight;
+ private KnuthNode bestFloatEdgeNode;
+ private FloatPosition floatPosition;
+
/**
* Construct a page breaking algorithm.
* @param topLevelLM the top level layout manager
@@ -235,6 +245,15 @@ class PageBreakingAlgorithm extends Brea
insertedFootnotesLength = 0;
footnoteListIndex = 0;
footnoteElementIndex = -1;
+ if (topLevelLM instanceof PageSequenceLayoutManager) {
+ PageSequenceLayoutManager pslm = (PageSequenceLayoutManager)
topLevelLM;
+ if (pslm.handlingStartOfFloat()) {
+ floatHeight = Math.min(pslm.getFloatHeight(), lineWidth -
pslm.getFloatYOffset());
+ }
+ if (pslm.handlingEndOfFloat()) {
+ totalWidth += pslm.getOffsetDueToFloat();
+ }
+ }
}
/**
@@ -352,6 +371,12 @@ class PageBreakingAlgorithm extends Brea
firstNewFootnoteIndex = footnotesList.size() - 1;
}
}
+ if (box instanceof KnuthBlockBox && ((KnuthBlockBox)
box).hasFloatAnchors()) {
+ handlingStartOfFloat = true;
+ }
+ if (floatHeight != 0 && totalWidth >= floatHeight) {
+ handlingEndOfFloat = true;
+ }
}
/**
@@ -1082,12 +1107,13 @@ class PageBreakingAlgorithm extends Brea
log.debug("BBA> difference=" + difference + " ratio=" + ratio
+ " position=" + bestActiveNode.position);
}
- insertPageBreakAsFirst(new PageBreakPosition(this.topLevelLM,
- bestActiveNode.position,
- firstListIndex, firstElementIndex,
- ((KnuthPageNode) bestActiveNode).footnoteListIndex,
- ((KnuthPageNode) bestActiveNode).footnoteElementIndex,
- ratio, difference));
+ if (handlingFloat() && floatPosition == null) {
+ floatPosition = new FloatPosition(this.topLevelLM,
bestActiveNode.position, ratio, difference);
+ } else {
+ insertPageBreakAsFirst(new PageBreakPosition(this.topLevelLM,
bestActiveNode.position,
+ firstListIndex, firstElementIndex, ((KnuthPageNode)
bestActiveNode).footnoteListIndex,
+ ((KnuthPageNode) bestActiveNode).footnoteElementIndex,
ratio, difference));
+ }
}
/** {@inheritDoc} */
@@ -1233,4 +1259,65 @@ class PageBreakingAlgorithm extends Brea
}
return pageProvider.compareIPDs(line);
}
+
+ protected boolean handlingFloat() {
+ return (handlingStartOfFloat || handlingEndOfFloat);
+ }
+
+ protected void createForcedNodes(KnuthNode node, int line, int elementIdx,
int difference, double r,
+ double demerits, int fitnessClass, int availableShrink, int
availableStretch, int newWidth,
+ int newStretch, int newShrink) {
+ super.createForcedNodes(node, line, elementIdx, difference, r,
demerits, fitnessClass,
+ availableShrink, availableStretch, newWidth, newStretch,
newShrink);
+ if (handlingFloat()) {
+ if (bestFloatEdgeNode == null || demerits <=
bestFloatEdgeNode.totalDemerits) {
+ bestFloatEdgeNode = createNode(elementIdx, line + 1,
fitnessClass, newWidth, newStretch,
+ newShrink, r, availableShrink, availableStretch,
difference, demerits, node);
+ }
+ }
+ }
+
+ protected int handleFloat() {
+ calculateBreakPoints(bestFloatEdgeNode, par, bestFloatEdgeNode.line);
+ activeLines = null;
+ return bestFloatEdgeNode.line - 1;
+ }
+
+ protected KnuthNode getBestFloatEdgeNode() {
+ return bestFloatEdgeNode;
+ }
+
+ protected FloatPosition getFloatPosition() {
+ return floatPosition;
+ }
+
+ protected int getFloatHeight() {
+ return floatHeight;
+ }
+
+ protected boolean handlingStartOfFloat() {
+ return handlingStartOfFloat;
+ }
+
+ protected boolean handlingEndOfFloat() {
+ return handlingEndOfFloat;
+ }
+
+ /**
+ * Deactivate the given node
+ *
+ * @param node the node
+ * @param line the line number
+ */
+ protected void deactivateNode(KnuthNode node, int line) {
+ super.deactivateNode(node, line);
+ if (handlingEndOfFloat) {
+ floatHeight = totalWidth;
+ }
+ }
+
+ protected void disableFloatHandling() {
+ handlingEndOfFloat = false;
+ handlingStartOfFloat = false;
+ }
}
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
Mon Oct 20 09:09:56 2014
@@ -56,6 +56,9 @@ public class PageSequenceLayoutManager e
/** Footnotes coming from repeated table footers, to be added after any
other footnote. */
private List<List<KnuthElement>> tableFooterFootnotes;
+ private int startIntrusionAdjustment;
+ private int endIntrusionAdjustment;
+
/**
* Constructor
*
@@ -293,4 +296,53 @@ public class PageSequenceLayoutManager e
}
}
+ public void setStartIntrusionAdjustment(int sia) {
+ startIntrusionAdjustment = sia;
+ }
+
+ public void setEndIntrusionAdjustment(int eia) {
+ endIntrusionAdjustment = eia;
+ }
+
+ public int getStartIntrusionAdjustment() {
+ return startIntrusionAdjustment;
+ }
+
+ public int getEndIntrusionAdjustment() {
+ return endIntrusionAdjustment;
+ }
+
+ public void recordEndOfFloat(int fHeight) {
+ pageBreaker.handleEndOfFloat(fHeight);
+ }
+
+ public boolean handlingEndOfFloat() {
+ return pageBreaker.handlingEndOfFloat();
+ }
+
+ public int getOffsetDueToFloat() {
+ return pageBreaker.getOffsetDueToFloat();
+ }
+
+ public void recordStartOfFloat(int fHeight, int fYOffset) {
+ pageBreaker.handleStartOfFloat(fHeight, fYOffset);
+ }
+
+ public boolean handlingStartOfFloat() {
+ return pageBreaker.handlingStartOfFloat();
+ }
+
+ public int getFloatHeight() {
+ return pageBreaker.getFloatHeight();
+ }
+
+ public int getFloatYOffset() {
+ return pageBreaker.getFloatYOffset();
+ }
+
+ public int getCurrentColumnWidth() {
+ int flowIPD = getCurrentPV().getCurrentSpan().getColumnWidth();
+ flowIPD -= startIntrusionAdjustment + endIntrusionAdjustment;
+ return flowIPD;
+ }
}
Added:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/FloatLayoutManager.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/FloatLayoutManager.java?rev=1633083&view=auto
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/FloatLayoutManager.java
(added)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/FloatLayoutManager.java
Mon Oct 20 09:09:56 2014
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.layoutmgr.inline;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.fop.fo.flow.Float;
+import org.apache.fop.layoutmgr.FloatContentLayoutManager;
+import org.apache.fop.layoutmgr.InlineKnuthSequence;
+import org.apache.fop.layoutmgr.KnuthElement;
+import org.apache.fop.layoutmgr.KnuthPossPosIter;
+import org.apache.fop.layoutmgr.KnuthSequence;
+import org.apache.fop.layoutmgr.LayoutContext;
+import org.apache.fop.layoutmgr.LayoutManager;
+import org.apache.fop.layoutmgr.Position;
+import org.apache.fop.layoutmgr.PositionIterator;
+import org.apache.fop.layoutmgr.SpaceResolver;
+
+public class FloatLayoutManager extends InlineStackingLayoutManager {
+
+ private FloatContentLayoutManager floatContentLM;
+ private KnuthInlineBox anchor;
+ private List<KnuthElement> floatContentKnuthElements;
+ private Float floatContent;
+ private boolean floatContentAreaAdded;
+
+ public FloatLayoutManager(Float node) {
+ super(node);
+ floatContent = node;
+ }
+
+ protected LayoutManager getChildLM() {
+ return null;
+ }
+
+ public LinkedList getNextKnuthElements(LayoutContext context, int
alignment) {
+
+ if (!floatContentAreaAdded) {
+ floatContentLM = new FloatContentLayoutManager(floatContent);
+ floatContentLM.setParent(this);
+ floatContentLM.initialize();
+ floatContentKnuthElements =
floatContentLM.getNextKnuthElements(context, alignment);
+ SpaceResolver.resolveElementList(floatContentKnuthElements);
+ }
+
+ // the only knuth element is a zero width and height knuth box
+ LinkedList knuthElements = new LinkedList();
+ KnuthSequence seq = new InlineKnuthSequence();
+ anchor = new KnuthInlineBox(0, null, null, true);
+ if (!floatContentAreaAdded) {
+ anchor.setFloatContentLM(floatContentLM);
+ }
+ anchor.setPosition(notifyPos(new Position(this)));
+ seq.add(anchor);
+ knuthElements.add(seq);
+ setFinished(true);
+
+ return knuthElements;
+ }
+
+ public void addAreas(PositionIterator posIter, LayoutContext context) {
+ // "Unwrap" the NonLeafPositions stored in posIter
+ LinkedList positionList = new LinkedList();
+ Position pos = null;
+ while (posIter.hasNext()) {
+ pos = posIter.next();
+ if (pos != null && pos.getPosition() != null) {
+ positionList.add(pos.getPosition());
+ }
+ }
+ }
+
+ public void processAreas(LayoutContext context) {
+ PositionIterator contentPosIter = new
KnuthPossPosIter(floatContentKnuthElements, 0,
+ floatContentKnuthElements.size());
+ floatContentLM.addAreas(contentPosIter, context);
+ floatContentAreaAdded = true;
+ anchor.setFloatContentLM(null);
+ }
+}
Propchange:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/FloatLayoutManager.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/KnuthInlineBox.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/KnuthInlineBox.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/KnuthInlineBox.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/KnuthInlineBox.java
Mon Oct 20 09:09:56 2014
@@ -19,6 +19,7 @@
package org.apache.fop.layoutmgr.inline;
+import org.apache.fop.layoutmgr.FloatContentLayoutManager;
import org.apache.fop.layoutmgr.FootnoteBodyLayoutManager;
import org.apache.fop.layoutmgr.KnuthBox;
import org.apache.fop.layoutmgr.Position;
@@ -30,6 +31,8 @@ public class KnuthInlineBox extends Knut
private FootnoteBodyLayoutManager footnoteBodyLM;
private AlignmentContext alignmentContext;
+ private FloatContentLayoutManager floatContentLM;
+
/**
* Create a new KnuthBox.
@@ -72,4 +75,17 @@ public class KnuthInlineBox extends Knut
public boolean isAnchor() {
return (footnoteBodyLM != null);
}
+
+ public void setFloatContentLM(FloatContentLayoutManager fclm) {
+ floatContentLM = fclm;
+ }
+
+ public FloatContentLayoutManager getFloatContentLM() {
+ return floatContentLM;
+ }
+
+ public boolean isFloatAnchor() {
+ return (floatContentLM != null);
+ }
+
}
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java
Mon Oct 20 09:09:56 2014
@@ -20,6 +20,7 @@
package org.apache.fop.layoutmgr.inline;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@@ -50,6 +51,7 @@ import org.apache.fop.layoutmgr.BlockLev
import org.apache.fop.layoutmgr.BreakElement;
import org.apache.fop.layoutmgr.BreakingAlgorithm;
import org.apache.fop.layoutmgr.ElementListObserver;
+import org.apache.fop.layoutmgr.FloatContentLayoutManager;
import org.apache.fop.layoutmgr.FootenoteUtil;
import org.apache.fop.layoutmgr.FootnoteBodyLayoutManager;
import org.apache.fop.layoutmgr.InlineKnuthSequence;
@@ -963,13 +965,19 @@ public class LineLayoutManager extends I
/* "normal" vertical alignment: create a sequence whose boxes
represent effective lines, and contain LineBreakPositions */
int startIndex = 0;
+ int previousEndIndex = 0;
for (int i = 0;
i < llPoss.getChosenLineCount();
i++) {
+ int orphans = fobj.getOrphans();
+ int widows = fobj.getWidows();
+ if (handlingFloat()) {
+ orphans = 1;
+ widows = 1;
+ }
if (returnList.size() > 0
&& i > 0 //if i==0 break generated above already
- && i >= fobj.getOrphans()
- && i <= llPoss.getChosenLineCount() -
fobj.getWidows()) {
+ && i >= orphans && i <=
llPoss.getChosenLineCount() - widows) {
// penalty allowing a page break between lines
Keep keep = getKeepTogether();
returnList.add(new BreakElement(
@@ -983,14 +991,28 @@ public class LineLayoutManager extends I
// whose citations are in this line
List<FootnoteBodyLayoutManager> footnoteList =
FootenoteUtil.getFootnotes(
seq, startIndex, endIndex);
+ List<FloatContentLayoutManager> floats =
FloatContentLayoutManager.checkForFloats(seq,
+ startIndex, endIndex);
startIndex = endIndex + 1;
LineBreakPosition lbp = (LineBreakPosition)
llPoss.getChosenPosition(i);
if (baselineOffset < 0) {
baselineOffset = lbp.spaceBefore + lbp.baseline;
}
- returnList.add(new KnuthBlockBox(
- lbp.lineHeight + lbp.spaceBefore +
lbp.spaceAfter,
- footnoteList, lbp, false));
+ if (floats.isEmpty()) {
+ returnList.add(new KnuthBlockBox(lbp.lineHeight +
lbp.spaceBefore + lbp.spaceAfter,
+ footnoteList, lbp, false));
+ } else {
+ // add a line with height zero and no content and
attach float to it
+ returnList.add(new KnuthBlockBox(0,
Collections.emptyList(), null, false, floats));
+ // add a break element to signal that we should
restart LB at this break
+ Keep keep = getKeepTogether();
+ returnList.add(new BreakElement(new LeafPosition(this,
p, previousEndIndex), keep
+ .getPenalty(), keep.getContext(), context));
+ // add the original line where the float was but
without the float now
+ returnList.add(new KnuthBlockBox(lbp.lineHeight +
lbp.spaceBefore + lbp.spaceAfter,
+ footnoteList, lbp, false));
+ }
+ previousEndIndex = endIndex;
}
}
}
@@ -1196,10 +1218,15 @@ public class LineLayoutManager extends I
for (int p = 0; p < knuthParagraphs.size(); p++) {
LineLayoutPossibilities llPoss = lineLayoutsList[p];
//log.debug("demerits of the chosen layout: " +
llPoss.getChosenDemerits());
+ int orphans = fobj.getOrphans();
+ int widows = fobj.getWidows();
+ if (handlingFloat()) {
+ orphans = 1;
+ widows = 1;
+ }
for (int i = 0; i < llPoss.getChosenLineCount(); i++) {
- if (!((BlockLevelLayoutManager)
parentLayoutManager).mustKeepTogether()
- && i >= fobj.getOrphans()
- && i <= llPoss.getChosenLineCount() - fobj.getWidows()) {
+ if (!((BlockLevelLayoutManager)
parentLayoutManager).mustKeepTogether() && i >= orphans
+ && i <= llPoss.getChosenLineCount() - widows) {
// null penalty allowing a page break between lines
returnList.add(new KnuthPenalty(0, 0, false, new
Position(this), false));
}
Modified:
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/java/org/apache/fop/layoutengine/LayoutEngineTestCase.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/test/java/org/apache/fop/layoutengine/LayoutEngineTestCase.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/java/org/apache/fop/layoutengine/LayoutEngineTestCase.java
(original)
+++
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/java/org/apache/fop/layoutengine/LayoutEngineTestCase.java
Mon Oct 20 09:09:56 2014
@@ -323,7 +323,11 @@ public class LayoutEngineTestCase {
throw new RuntimeException("No available area tree check");
}
for (LayoutEngineCheck check : checks) {
- check.check(result);
+ try {
+ check.check(result);
+ } catch (RuntimeException rte) {
+ throw new RuntimeException("Layout test (" +
testFile.getName() + "): " + rte.getMessage());
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]