aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorarved <arved@unknown>2000-12-18 03:29:49 +0000
committerarved <arved@unknown>2000-12-18 03:29:49 +0000
commit5fda8671c8da4fb856843e09e468e32dffd591fe (patch)
tree1a562101a26df5917bf1ada73cbd1766c1a4fa11
parent6fd5d987513c63d6165216bff1a1dc931c881d7f (diff)
downloadxmlgraphics-fop-5fda8671c8da4fb856843e09e468e32dffd591fe.tar.gz
xmlgraphics-fop-5fda8671c8da4fb856843e09e468e32dffd591fe.zip
Works with BodyAreaContainer
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193889 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--src/org/apache/fop/fo/flow/Flow.java124
-rw-r--r--src/org/apache/fop/layout/Page.java16
2 files changed, 100 insertions, 40 deletions
diff --git a/src/org/apache/fop/fo/flow/Flow.java b/src/org/apache/fop/fo/flow/Flow.java
index ed3bad8a8..f70859a3c 100644
--- a/src/org/apache/fop/fo/flow/Flow.java
+++ b/src/org/apache/fop/fo/flow/Flow.java
@@ -56,12 +56,14 @@ import org.apache.fop.fo.*;
import org.apache.fop.fo.properties.*;
import org.apache.fop.fo.pagination.*;
import org.apache.fop.layout.Area;
+import org.apache.fop.layout.BodyAreaContainer;
import org.apache.fop.apps.FOPException;
import org.apache.fop.messaging.MessageHandler;
// Java
import java.util.Hashtable;
import java.util.Enumeration;
+import java.util.Vector;
public class Flow extends FObj {
@@ -82,6 +84,9 @@ public class Flow extends FObj {
/** Area in which we lay out our kids */
private Area area;
+ /** Vector to store snapshot */
+ private Vector markerSnapshot;
+
/** flow-name attribute */
private String _flowName;
@@ -128,41 +133,85 @@ public class Flow extends FObj {
}
public Status layout(Area area, Region region) throws FOPException {
- if (this.marker == START) {
- this.marker = 0;
- }
- this.area = area;
- boolean prevChildMustKeepWithNext = false;
-
- int numChildren = this.children.size();
- for (int i = this.marker; i < numChildren; i++) {
- FObj fo = (FObj) children.elementAt(i);
- if ((_status = fo.layout(area)).isIncomplete()) {
- if ((prevChildMustKeepWithNext) && (_status.laidOutNone())) {
- this.marker = i - 1;
- FObj prevChild = (FObj) children.elementAt(this.marker);
- prevChild.removeAreas();
- prevChild.resetMarker();
- prevChild.removeID(area.getIDReferences());
- _status = new Status(Status.AREA_FULL_SOME);
- return _status;
- // should probably return AREA_FULL_NONE if first
- // or perhaps an entirely new status code
- } else {
- this.marker = i;
- return _status;
+ if (this.marker == START) {
+ this.marker = 0;
}
- }
- if (_status.getCode() == Status.KEEP_WITH_NEXT) {
- prevChildMustKeepWithNext = true;
- }
- else {
- prevChildMustKeepWithNext = false;
- }
-
- }
- _status = new Status(Status.OK);
- return _status;
+
+ boolean prevChildMustKeepWithNext = false;
+
+ int numChildren = this.children.size();
+ for (int i = this.marker; i < numChildren; i++) {
+ FObj fo = (FObj) children.elementAt(i);
+
+ // if the area is a BodyAreaContainer, we need to perform an iterative
+ // layout over each span area, and the columns in each of those
+ Area currentArea;
+ if (area instanceof BodyAreaContainer)
+ {
+ BodyAreaContainer bac = (BodyAreaContainer)area;
+ if (bac.isBalancingRequired(fo))
+ {
+ // reset the the just-done span area in preparation
+ // for a backtrack for balancing
+ bac.resetSpanArea();
+
+ this.rollback(markerSnapshot);
+ // one less because of the "continue"
+ i = this.marker - 1;
+ continue;
+ }
+ currentArea = bac.getNextArea(fo);
+ // temporary hack
+ currentArea.setIDReferences(bac.getIDReferences());
+ if (bac.isNewSpanArea())
+ {
+ this.marker = i;
+ markerSnapshot = this.getMarkerSnapshot(new Vector());
+ }
+ }
+ else
+ currentArea = area;
+ if (null == currentArea)
+ throw new FOPException("Bad BodyAreaContainer");
+
+ _status = fo.layout(currentArea);
+ if (_status.isIncomplete()) {
+ if (area instanceof BodyAreaContainer)
+ {
+ if (((BodyAreaContainer)area).isLastColumn())
+ {
+ this.marker = i;
+ return getStatus();
+ }
+ else
+ {
+ // I don't much like exposing this. (AHS 001217)
+ ((org.apache.fop.layout.ColumnArea)currentArea).incrementSpanIndex();
+ i--;
+ }
+ }
+ else if ((prevChildMustKeepWithNext) && (_status.laidOutNone())) {
+ this.marker = i - 1;
+ FObj prevChild = (FObj) children.elementAt(this.marker);
+ prevChild.removeAreas();
+ prevChild.resetMarker();
+ prevChild.removeID(area.getIDReferences());
+ return setStatus(new Status(Status.AREA_FULL_SOME));
+ // should probably return AREA_FULL_NONE if first
+ // or perhaps an entirely new status code
+ } else {
+ this.marker = i;
+ return getStatus();
+ }
+ }
+ if (_status.getCode() == Status.KEEP_WITH_NEXT) {
+ prevChildMustKeepWithNext = true;
+ }
+ else {
+ prevChildMustKeepWithNext = false;
+ }
+ }
+ return setStatus(new Status(Status.OK));
}
/**
@@ -185,6 +234,9 @@ public class Flow extends FObj {
return _status;
}
-
-
+ public Status setStatus(Status status)
+ {
+ _status = status;
+ return _status; // shortcut
+ }
}
diff --git a/src/org/apache/fop/layout/Page.java b/src/org/apache/fop/layout/Page.java
index 304a1b409..a53094406 100644
--- a/src/org/apache/fop/layout/Page.java
+++ b/src/org/apache/fop/layout/Page.java
@@ -63,7 +63,7 @@ public class Page {
private int height;
private int width;
- private AreaContainer body;
+ private BodyAreaContainer body;
private AreaContainer before;
private AreaContainer after;
private AreaContainer start;
@@ -101,11 +101,19 @@ public class Page {
area.setPage(this);
}
- void addBody(AreaContainer area) {
+ /**
+ * Ensure that page is set not only on B.A.C. but also on the
+ * three top-level reference areas.
+ * @param area The region-body area container (special)
+ */
+ public void addBody(BodyAreaContainer area) {
this.body = area;
area.setPage(this);
+ ((BodyAreaContainer)area).getMainReferenceArea().setPage(this);
+ ((BodyAreaContainer)area).getBeforeFloatReferenceArea().setPage(this);
+ ((BodyAreaContainer)area).getFootnoteReferenceArea().setPage(this);
}
-
+
void addEnd(AreaContainer area) {
this.end = area;
area.setPage(this);
@@ -128,7 +136,7 @@ public class Page {
return this.before;
}
- public AreaContainer getBody() {
+ public BodyAreaContainer getBody() {
return this.body;
}