import org.xml.sax.SAXException;
-import org.apache.fop.layout.FontInfo;
-import org.apache.fop.layout.Page;
-import org.apache.fop.render.Renderer;
-import org.apache.fop.layout.AreaTree;
import org.apache.fop.datatypes.IDReferences;
import org.apache.fop.extensions.ExtensionObj;
+import org.apache.fop.fo.flow.Marker;
import org.apache.fop.fo.pagination.PageSequence;
+import org.apache.fop.layout.AreaTree;
+import org.apache.fop.layout.FontInfo;
+import org.apache.fop.layout.Page;
+import org.apache.fop.render.Renderer;
import org.apache.avalon.framework.logger.Logger;
*/
private ArrayList extensions = new ArrayList();
+ /**
+ * The list of markers.
+ */
+ private ArrayList documentMarkers;
+ private ArrayList currentPageSequenceMarkers;
+ private PageSequence currentPageSequence;
+
private Logger log;
public StreamRenderer(OutputStream outputStream, Renderer renderer) {
pageCount = 0;
if (MEM_PROFILE_WITH_GC)
- System.gc(); // This takes time but gives better results
+ System.gc(); // This takes time but gives better results
initialMemory = runtime.totalMemory() - runtime.freeMemory();
startTime = System.currentTimeMillis();
}
if (MEM_PROFILE_WITH_GC)
- System.gc(); // This takes time but gives better results
+ System.gc(); // This takes time but gives better results
long memoryNow = runtime.totalMemory() - runtime.freeMemory();
long memoryUsed = (memoryNow - initialMemory) / 1024L;
public synchronized void queuePage(Page page)
throws FOPException, IOException {
+
+ // process markers
+ PageSequence pageSequence = page.getPageSequence();
+ if (pageSequence != currentPageSequence) {
+ currentPageSequence = pageSequence;
+ currentPageSequenceMarkers = null;
+ }
+ ArrayList markers = page.getMarkers();
+ if (markers != null) {
+ if (documentMarkers == null) {
+ documentMarkers = new ArrayList();
+ }
+ if (currentPageSequenceMarkers == null) {
+ currentPageSequenceMarkers = new ArrayList();
+ }
+ for (int i=0;i<markers.size();i++) {
+ Marker marker = (Marker)markers.get(i);
+ marker.releaseRegistryArea();
+ currentPageSequenceMarkers.add(marker);
+ documentMarkers.add(marker);
+ }
+ }
+
/*
Try to optimise on the common case that there are
no pages pending and that all ID references are
valid on the current pages. This short-cuts the
pipeline and renders the area immediately.
*/
- if ((renderQueue.size() == 0) && idReferences.isEveryIdValid())
+ if ((renderQueue.size() == 0) && idReferences.isEveryIdValid()) {
renderer.render(page, outputStream);
- else
- addToRenderQueue(page);
-
+ } else {
+ RenderQueueEntry entry = new RenderQueueEntry(page);
+ renderQueue.add(entry);
+ /*
+ The just-added entry could (possibly) resolve the
+ waiting entries, so we try to process the queue
+ now to see.
+ */
+ processQueue(false);
+ }
pageCount++;
}
- private synchronized void addToRenderQueue(Page page)
- throws FOPException, IOException {
- RenderQueueEntry entry = new RenderQueueEntry(page);
- renderQueue.add(entry);
-
- /*
- The just-added entry could (possibly) resolve the
- waiting entries, so we try to process the queue
- now to see.
- */
- processQueue(false);
- }
-
/**
Try to process the queue from the first entry forward.
If an entry can't be processed, then the queue can't
plus a list of outstanding ID references that need to be
resolved before the Page can be renderered.<P>
*/
- class RenderQueueEntry extends Object {
+ class RenderQueueEntry {
/*
The Page that has outstanding ID references.
*/
}
}
- // unused and broken
-// public Page getNextPage(Page current, boolean isWithinPageSequence,
-// boolean isFirstCall) {
-// Page nextPage = null;
-// int pageIndex = 0;
-// if (isFirstCall)
-// pageIndex = renderQueue.size();
-// else
-// pageIndex = renderQueue.indexOf(current);
-// if ((pageIndex + 1) < renderQueue.size()) {
-// nextPage = ((RenderQueueEntry)renderQueue
-// .get(pageIndex + 1)).getPage();
-// if (isWithinPageSequence
-// &&!nextPage.getPageSequence().equals(current.getPageSequence())) {
-// nextPage = null;
-// }
-// }
-// return nextPage;
-// }
-
- public Page getPreviousPage(Page current, boolean isWithinPageSequence,
- boolean isFirstCall) {
- if (isFirstCall) {
- int pageIndex = renderQueue.size();
- if (pageIndex > 0) {
- Page previousPage = ((RenderQueueEntry)renderQueue
- .get(pageIndex - 1)).getPage();
- PageSequence currentPS = current.getPageSequence();
- PageSequence previousPS = previousPage.getPageSequence();
- if (!isWithinPageSequence || previousPS.equals(currentPS)) {
- return previousPage;
- }
- }
- } else {
- for (int pageIndex=renderQueue.size()-1;pageIndex>0;pageIndex--) {
- Page page = ((RenderQueueEntry)renderQueue
- .get(pageIndex)).getPage();
- if (current.equals(page)) {
- Page previousPage = ((RenderQueueEntry)renderQueue
- .get(pageIndex - 1)).getPage();
- PageSequence currentPS = current.getPageSequence();
- PageSequence previousPS = previousPage.getPageSequence();
- if (!isWithinPageSequence || previousPS.equals(currentPS)) {
- return previousPage;
- }
- return null;
- }
- }
- }
- return null;
+ // Auxillary function for retrieving markers.
+ public ArrayList getDocumentMarkers() {
+ return documentMarkers;
+ }
+
+ // Auxillary function for retrieving markers.
+ public PageSequence getCurrentPageSequence() {
+ return currentPageSequence;
+ }
+
+ // Auxillary function for retrieving markers.
+ public ArrayList getCurrentPageSequenceMarkers() {
+ return currentPageSequenceMarkers;
}
}
public void resetMarker() {
this.marker = START;
+ this.areasGenerated=0;
int numChildren = this.children.size();
for (int i = 0; i < numChildren; i++) {
((FONode)children.get(i)).resetMarker();
import org.apache.fop.fo.flow.Marker;
// Java
-import java.util.HashMap;
+import java.util.HashSet;
import java.util.ArrayList;
/**
protected PropertyManager propMgr;
// markers
- private HashMap markers;
+ private HashSet markerClassNames;
protected FObj(FObj parent, PropertyList propertyList) {
super(parent);
}
- public void addMarker(Marker marker) throws FOPException {
- String mcname = marker.getMarkerClassName();
- if (children != null) {
- for (int i = 0; i < children.size(); i++) {
- FONode child = (FONode)children.get(i);
- if (!child.mayPrecedeMarker()) {
- throw new FOPException("A fo:marker must be an initial child of '"
- + getName()+"'");
- }
- }
- }
- if (markers==null) {
- markers = new HashMap();
- markers.put(mcname, marker);
- } else if (!markers.containsKey(mcname) ) {
- markers.put(mcname, marker);
- } else {
- throw new FOPException("marker-class-name '"
- + mcname
- + "' already exists for this parent");
- }
- }
-
- public boolean hasMarkers() {
- return markers!=null;
- }
-
- public ArrayList getMarkers() {
- if (markers==null) {
- log.debug("GetMarkers failed (no markers). Should not happen.");
- return null;
- } else {
- return new ArrayList(markers.values());
- }
- }
+ public void addMarker(String markerClassName) throws FOPException {
+// String mcname = marker.getMarkerClassName();
+ if (children != null) {
+ for (int i = 0; i < children.size(); i++) {
+ FONode child = (FONode)children.get(i);
+ if (!child.mayPrecedeMarker()) {
+ throw new FOPException("A fo:marker must be an initial child of '"
+ + getName()+"'");
+ }
+ }
+ }
+ if (markerClassNames==null) {
+ markerClassNames = new HashSet();
+ markerClassNames.add(markerClassName);
+ } else if (!markerClassNames.contains(markerClassName) ) {
+ markerClassNames.add(markerClassName);
+ } else {
+ throw new FOPException("marker-class-name '"
+ + markerClassName
+ + "' already exists for this parent");
+ }
+ }
+
+// public boolean hasMarkers() {
+// return markers!=null;
+// }
+
+// public ArrayList getMarkers() {
+// if (markers==null) {
+// log.debug("GetMarkers failed (no markers). Should not happen.");
+// return null;
+// } else {
+// return new ArrayList(markers.values());
+// }
+// }
}
boolean endKeepGroup = true;
for (int i = this.marker; i < numChildren; i++) {
Object child = children.get(i);
+ if (child instanceof Marker) {
+ ((Marker)child).layout(area);
+ continue;
+ }
if (!(child instanceof TableRow)) {
throw new FOPException("Currently only Table Rows are supported in table body, header and footer");
}
if (this.areasGenerated == 1)
blockArea.isFirst(true);
// for normal areas this should be the only pair
- blockArea.addLineagePair(this, this.areasGenerated);
+// blockArea.addLineagePair(this, this.areasGenerated);
// markers
- if (this.hasMarkers())
- blockArea.addMarkers(this.getMarkers());
+// if (this.hasMarkers())
+// blockArea.addMarkers(this.getMarkers());
blockArea.setParent(area); // BasicLink needs it
blockArea.setPage(area.getPage());
if (this.areasGenerated == 1)
blockArea.isFirst(true);
// for normal areas this should be the only pair
- blockArea.addLineagePair(this, this.areasGenerated);
+// blockArea.addLineagePair(this, this.areasGenerated);
// markers
- if (this.hasMarkers())
- blockArea.addMarkers(this.getMarkers());
+// if (this.hasMarkers())
+// blockArea.addMarkers(this.getMarkers());
blockArea.setParent(area);
if (this.areasGenerated == 1)
this.blockArea.isFirst(true);
// for normal areas this should be the only pair
- this.blockArea.addLineagePair(this, this.areasGenerated);
+// this.blockArea.addLineagePair(this, this.areasGenerated);
// markers
- if (this.hasMarkers())
- this.blockArea.addMarkers(this.getMarkers());
+// if (this.hasMarkers())
+// this.blockArea.addMarkers(this.getMarkers());
blockArea.setParent(area);
blockArea.setPage(area.getPage());
private String markerClassName;
private Area registryArea;
+ private boolean isFirst;
+ private boolean isLast;
public static class Maker extends FObj.Maker {
public FObj make(FObj parent,
// check to ensure that no other marker with same parent
// has this 'marker-class-name' is in addMarker() method
- parent.addMarker(this);
+ parent.addMarker(this.markerClassName);
}
public String getName() {
public int layout(Area area) throws FOPException {
// no layout action desired
this.registryArea = area;
- area.addMarker(this);
area.getPage().registerMarker(this);
- // System.out.println("Marker being registered in area '" + area + "'");
return Status.OK;
}
public boolean mayPrecedeMarker() {
return true;
}
+
+ // The page the marker was registered is put into the renderer
+ // queue. The marker is transferred to it's own marker list,
+ // release the area for GC. We also know now whether the area is
+ // first/last.
+ public void releaseRegistryArea() {
+ isFirst = registryArea.isFirst();
+ isLast = registryArea.isLast();
+ registryArea = null;
+ }
+
+ // This has actually nothing to do with resseting this marker,
+ // but the 'marker' from FONode, marking layout status.
+ // Called in case layout is to be rolled back. Unregister this
+ // marker from the page, it isn't laid aout anyway.
+ public void resetMarker() {
+ if (registryArea != null ) {
+ Page page=registryArea.getPage();
+ if (page != null) {
+ page.unregisterMarker(this);
+ }
+ }
+ }
+
+ // More hackery: reset layout status marker. Called before the
+ // content is laid out from RetrieveMarker.
+ public void resetMarkerContent() {
+ super.resetMarker();
+ }
}
package org.apache.fop.fo.flow;
// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.datatypes.*;
+import org.apache.fop.fo.FObj;
+import org.apache.fop.fo.PropertyList;
+import org.apache.fop.fo.Status;
+import org.apache.fop.fo.pagination.PageSequence;
+import org.apache.fop.fo.properties.RetrieveBoundary;
+import org.apache.fop.fo.properties.RetrievePosition;
+import org.apache.fop.layout.Area;
+import org.apache.fop.layout.AreaTree;
+import org.apache.fop.layout.Page;
import org.apache.fop.apps.FOPException;
// Java
private String retrieveClassName;
private int retrievePosition;
private int retrieveBoundary;
+ private Marker bestMarker;
public static class Maker extends FObj.Maker {
public FObj make(FObj parent,
}
public int layout(Area area) throws FOPException {
- // locate qualifying areas by 'marker-class-name' and
- // 'retrieve-boundary'. Initially we will always check
- // the containing page
- Page containingPage = area.getPage();
- Marker bestMarker = searchPage(containingPage, true);
-
- // if marker not yet found, and 'retrieve-boundary' permits,
- // search backward by Page
- if (bestMarker == null) {
- if (retrieveBoundary != RetrieveBoundary.PAGE) {
-// System.out.println("Null bestMarker and searching...");
- Page currentPage = containingPage;
- boolean isFirstCall = true;
- while (bestMarker == null) {
- Page previousPage = locatePreviousPage(currentPage,
- retrieveBoundary,
- isFirstCall);
- isFirstCall = false;
- if (previousPage!=null) {
- bestMarker = searchPage(previousPage, false);
- currentPage = previousPage;
- } else {
- return Status.OK;
- }
+ if (marker == START) {
+ marker = 0;
+ // locate qualifying areas by 'marker-class-name' and
+ // 'retrieve-boundary'. Initially we will always check
+ // the containing page
+ Page containingPage = area.getPage();
+ bestMarker = searchPage(containingPage);
+
+ if (bestMarker != null) {
+ bestMarker.resetMarkerContent();
+ return bestMarker.layoutMarker(area);
+ }
+ // If marker not yet found, and 'retrieve-boundary' permits,
+ // search backward.
+ AreaTree areaTree = containingPage.getAreaTree();
+ if (retrieveBoundary == RetrieveBoundary.PAGE_SEQUENCE) {
+ PageSequence pageSequence = areaTree.getCurrentPageSequence();
+ if (pageSequence == containingPage.getPageSequence() ) {
+ return layoutBestMarker(areaTree.getCurrentPageSequenceMarkers(),area);
}
+ } else if (retrieveBoundary == RetrieveBoundary.DOCUMENT) {
+ return layoutBestMarker(areaTree.getDocumentMarkers(),area);
} else {
- return Status.OK;
+ throw new FOPException("Illegal 'retrieve-boundary' value");
}
+ } else if (bestMarker != null) {
+ return bestMarker.layoutMarker(area);
}
-
- int status = Status.OK;
- // System.out.println("Laying out marker '" + bestMarker + "' in area '" + area + "'");
- // the 'markers' referred to in this method are internal; they have
- // nothing to do with fo:marker
- bestMarker.resetMarker();
- status = bestMarker.layoutMarker(area);
- return status;
+ return Status.OK;
}
- private Marker searchPage(Page page,
- boolean isContainingPage) throws FOPException {
- ArrayList pageMarkers = page.getMarkers();
- if (pageMarkers.isEmpty()) {
- // System.out.println("No markers on page");
- return null;
- }
-
- // if no longer the containing page (fo:retrieve-marker, or the page
- // being processed), grab the last qualifying marker on this one
- if (!isContainingPage) {
- for (int c = pageMarkers.size(); c > 0; c--) {
- Marker currentMarker = (Marker)pageMarkers.get(c - 1);
+ private int layoutBestMarker(ArrayList markers, Area area)
+ throws FOPException {
+ if (markers!=null) {
+ for (int i = markers.size() - 1; i >= 0; i--) {
+ Marker currentMarker = (Marker)markers.get(i);
if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
- return currentMarker;
+ bestMarker = currentMarker;
+ bestMarker.resetMarkerContent();
+ return bestMarker.layoutMarker(area);
}
}
}
+ return Status.OK;
+ }
+
+ private Marker searchPage(Page page) throws FOPException {
+ ArrayList pageMarkers = page.getMarkers();
+ if (pageMarkers.isEmpty()) {
+ return null;
+ }
// search forward if 'first-starting-within-page' or
// 'first-including-carryover'
if (retrievePosition == RetrievePosition.FIC) {
- for (int c = 0; c < pageMarkers.size(); c++) {
- Marker currentMarker = (Marker)pageMarkers.get(c);
+ for (int i = 0; i < pageMarkers.size(); i++) {
+ Marker currentMarker = (Marker)pageMarkers.get(i);
if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
return currentMarker;
}
}
}
} else if (retrievePosition == RetrievePosition.LSWP) {
- for (int i = pageMarkers.size(); i > 0; i--) {
- Marker currentMarker = (Marker)pageMarkers.get(i - 1);
+ for (int i = pageMarkers.size() - 1; i >= 0; i--) {
+ Marker currentMarker = (Marker)pageMarkers.get(i);
if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
if (currentMarker.getRegistryArea().isFirst()) {
return currentMarker;
}
} else if (retrievePosition == RetrievePosition.LEWP) {
- for (int c = pageMarkers.size(); c > 0; c--) {
- Marker currentMarker = (Marker)pageMarkers.get(c - 1);
+ for (int i = pageMarkers.size() - 1; i >= 0; i--) {
+ Marker currentMarker = (Marker)pageMarkers.get(i);
if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
if (currentMarker.getRegistryArea().isLast()) {
return currentMarker;
return null;
}
- private Page locatePreviousPage(Page page, int retrieveBoundary,
- boolean isFirstCall) {
- boolean pageWithinSequence = true;
- if (retrieveBoundary == RetrieveBoundary.DOCUMENT)
- pageWithinSequence = false;
- return page.getAreaTree().getPreviousPage(page, pageWithinSequence,
- isFirstCall);
- }
-
}
for (int i = this.marker; i < numChildren; i++) {
FONode fo = (FONode)children.get(i);
+ if (fo instanceof Marker) {
+ ((Marker)fo).layout(area);
+ continue;
+ }
if (fo instanceof TableHeader) {
if (columns.size() == 0) {
log.warn("current implementation of tables requires a table-column for each column, indicating column-width");
return Status.OK;
}
- public void resetMarker() {
- this.areasGenerated=0;
- super.resetMarker();
- }
-
protected void setupColumnHeights() {
for (int i = 0; i < columns.size(); i++) {
TableColumn c = (TableColumn)columns.get(i);
// FOP
import org.apache.fop.datatypes.*;
-import org.apache.fop.fo.flow.Marker;
+//import org.apache.fop.fo.flow.Marker;
import org.apache.fop.layout.inline.InlineSpace;
// Java
private IDReferences idReferences;
- protected ArrayList markers;
+// protected ArrayList markers;
// as defined in Section 6.1.1
protected org.apache.fop.fo.FObj generatedBy; // corresponds to 'generated-by' trait
- protected HashMap returnedBy;
+// protected HashMap returnedBy;
// as defined in Section 6.1.1
protected String areaClass;
public Area(FontState fontState) {
setFontState(fontState);
- this.markers = new ArrayList();
- this.returnedBy = new HashMap();
+// this.markers = new ArrayList();
+// this.returnedBy = new HashMap();
}
/**
this.allocationWidth = allocationWidth;
this.contentRectangleWidth = allocationWidth;
this.maxHeight = maxHeight;
- this.markers = new ArrayList();
- this.returnedBy = new HashMap();
+// this.markers = new ArrayList();
+// this.returnedBy = new HashMap();
}
private void setFontState(FontState fontState) {
return bp;
}
- public void addMarker(Marker marker) {
- markers.add(marker);
- }
+// public void addMarker(Marker marker) {
+// markers.add(marker);
+// }
- public void addMarkers(ArrayList markers) {
- markers.addAll(markers);
- }
+// public void addMarkers(ArrayList markers) {
+// markers.addAll(markers);
+// }
- public void addLineagePair(org.apache.fop.fo.FObj fo, int areaPosition) {
- returnedBy.put(fo, new Integer(areaPosition));
- }
+// public ArrayList getMarkers() {
+// return markers;
+// }
- public ArrayList getMarkers() {
- return markers;
- }
+// public void addLineagePair(org.apache.fop.fo.FObj fo, int areaPosition) {
+// returnedBy.put(fo, new Integer(areaPosition));
+// }
public void setGeneratedBy(org.apache.fop.fo.FObj generatedBy) {
this.generatedBy = generatedBy;
return this.fontInfo;
}
-// public Page getNextPage(Page current, boolean isWithinPageSequence,
-// boolean isFirstCall) {
-// return streamRenderer.getNextPage(current, isWithinPageSequence,isFirstCall);
-// }
-
- public Page getPreviousPage(Page current, boolean isWithinPageSequence,
- boolean isFirstCall) {
- return streamRenderer.getPreviousPage(current,isWithinPageSequence,isFirstCall);
- }
-
public void addPage(Page page)
throws FOPException {
try {
rootExtensions.add(obj);
}
+ // Auxillary function for retrieving markers.
+ public ArrayList getDocumentMarkers() {
+ return streamRenderer.getDocumentMarkers();
+ }
+
+ // Auxillary function for retrieving markers.
+ public PageSequence getCurrentPageSequence() {
+ return streamRenderer.getCurrentPageSequence();
+ }
+
+ // Auxillary function for retrieving markers.
+ public ArrayList getCurrentPageSequenceMarkers() {
+ return streamRenderer.getCurrentPageSequenceMarkers();
+ }
}
markers.add(marker);
}
+ public void unregisterMarker(Marker marker) {
+ markers.remove(marker);
+ }
+
public ArrayList getMarkers() {
return this.markers;
}
writeStartTag(baText.toString());
// write out marker info
- List markers = area.getMarkers();
- if (!markers.isEmpty()) {
- writeStartTag("<Markers>");
- for (int i = 0; i < markers.size(); i++) {
- org.apache.fop.fo.flow.Marker marker =
- (org.apache.fop.fo.flow.Marker)markers.get(i);
- StringBuffer maText = new StringBuffer();
- maText.append("<Marker marker-class-name=\""
- + marker.getMarkerClassName() + "\"");
- maText.append(" RegisteredArea=\"" + marker.getRegistryArea()
- + "\"");
- maText.append("/>");
- writeEmptyElementTag(maText.toString());
- }
- writeEndTag("</Markers>");
- }
+// List markers = area.getMarkers();
+// if (!markers.isEmpty()) {
+// writeStartTag("<Markers>");
+// for (int i = 0; i < markers.size(); i++) {
+// org.apache.fop.fo.flow.Marker marker =
+// (org.apache.fop.fo.flow.Marker)markers.get(i);
+// StringBuffer maText = new StringBuffer();
+// maText.append("<Marker marker-class-name=\""
+// + marker.getMarkerClassName() + "\"");
+// maText.append(" RegisteredArea=\"" + marker.getRegistryArea()
+// + "\"");
+// maText.append("/>");
+// writeEmptyElementTag(maText.toString());
+// }
+// writeEndTag("</Markers>");
+// }
List children = area.getChildren();
for (int i = 0; i < children.size(); i++) {
writeStartTag(iaText.toString());
// write out marker info
- List markers = area.getMarkers();
- if (!markers.isEmpty()) {
- writeStartTag("<Markers>");
- for (int i = 0; i < markers.size(); i++) {
- org.apache.fop.fo.flow.Marker marker =
- (org.apache.fop.fo.flow.Marker)markers.get(i);
- StringBuffer maText = new StringBuffer();
- maText.append("<Marker marker-class-name=\""
- + marker.getMarkerClassName() + "\"");
- maText.append(" RegisteredArea=\"" + marker.getRegistryArea()
- + "\"");
- maText.append("/>");
- writeEmptyElementTag(maText.toString());
- }
- writeEndTag("</Markers>");
- }
+// List markers = area.getMarkers();
+// if (!markers.isEmpty()) {
+// writeStartTag("<Markers>");
+// for (int i = 0; i < markers.size(); i++) {
+// org.apache.fop.fo.flow.Marker marker =
+// (org.apache.fop.fo.flow.Marker)markers.get(i);
+// StringBuffer maText = new StringBuffer();
+// maText.append("<Marker marker-class-name=\""
+// + marker.getMarkerClassName() + "\"");
+// maText.append(" RegisteredArea=\"" + marker.getRegistryArea()
+// + "\"");
+// maText.append("/>");
+// writeEmptyElementTag(maText.toString());
+// }
+// writeEndTag("</Markers>");
+// }
List children = area.getChildren();
for (int i = 0; i < children.size(); i++) {
}
// needed for compiling under jdk1.4
+ @jdk14codestart@
public java.awt.image.VolatileImage createCompatibleVolatileImage(int width, int height) {
return null;
}
+ @jdk14codeend@
}
/**