/* * Copyright 1999-2005 The Apache Software Foundation. * * Licensed 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.fo.flow; // Java import java.util.Iterator; import java.util.List; import org.xml.sax.Locator; import org.apache.fop.apps.FOPException; import org.apache.fop.fo.FONode; import org.apache.fop.fo.FObj; import org.apache.fop.fo.PropertyList; import org.apache.fop.fo.StaticPropertyList; import org.apache.fop.fo.ValidationException; import org.apache.fop.fo.properties.CommonAccessibility; import org.apache.fop.fo.properties.CommonAural; import org.apache.fop.fo.properties.CommonBorderPaddingBackground; import org.apache.fop.fo.properties.CommonRelativePosition; /** * Class modelling the fo:table-body object. */ public class TableBody extends FObj { // The value of properties relevant for fo:table-body. private CommonAccessibility commonAccessibility; private CommonAural commonAural; private CommonBorderPaddingBackground commonBorderPaddingBackground; private CommonRelativePosition commonRelativePosition; // private ToBeImplementedProperty borderAfterPrecedence; // private ToBeImplementedProperty borderBeforePrecedence; // private ToBeImplementedProperty borderEndPrecedence; // private ToBeImplementedProperty borderStartPrecedence; private int visibility; // End of property values private PropertyList savedPropertyList; protected boolean tableRowsFound = false; protected boolean tableCellsFound = false; /** * @param parent FONode that is the parent of the object */ public TableBody(FONode parent) { super(parent); } /** * @see FObj#bind(PropertyList) */ public void bind(PropertyList pList) throws FOPException { commonAccessibility = pList.getAccessibilityProps(); commonAural = pList.getAuralProps(); commonBorderPaddingBackground = pList.getBorderPaddingBackgroundProps(); commonRelativePosition = pList.getRelativePositionProps(); // borderAfterPrecedence = pList.get(PR_BORDER_AFTER_PRECEDENCE); // borderBeforePrecedence = pList.get(PR_BORDER_BEFORE_PRECEDENCE); // borderEndPrecedence = pList.get(PR_BORDER_END_PRECEDENCE); // borderStartPrecedence = pList.get(PR_BORDER_START_PRECEDENCE); visibility = pList.get(PR_VISIBILITY).getEnum(); //Used by convertCellsToRows() savedPropertyList = pList; } /** * @see org.apache.fop.fo.FONode#startOfNode */ protected void startOfNode() throws FOPException { getFOEventHandler().startBody(this); } /** * @see org.apache.fop.fo.FONode#endOfNode */ protected void endOfNode() throws FOPException { getFOEventHandler().endBody(this); if (!(tableRowsFound || tableCellsFound)) { if (getUserAgent().validateStrictly()) { missingChildElementError("marker* (table-row+|table-cell+)"); } else { getLogger().error("fo:table-body must not be empty. " + "Expected: marker* (table-row+|table-cell+)"); getParent().removeChild(this); } } /* if (tableCellsFound) { convertCellsToRows(); }*/ savedPropertyList = null; //Release reference } /** * @see org.apache.fop.fo.FONode#validateChildNode(Locator, String, String) * XSL Content Model: marker* (table-row+|table-cell+) */ protected void validateChildNode(Locator loc, String nsURI, String localName) throws ValidationException { if (FO_URI.equals(nsURI)) { if (localName.equals("marker")) { if (tableRowsFound || tableCellsFound) { nodesOutOfOrderError(loc, "fo:marker", "(table-row+|table-cell+)"); } } else if (localName.equals("table-row")) { tableRowsFound = true; if (tableCellsFound) { invalidChildError(loc, nsURI, localName, "Either fo:table-rows" + " or fo:table-cells may be children of an " + getName() + " but not both"); } } else if (localName.equals("table-cell")) { tableCellsFound = true; if (tableRowsFound) { invalidChildError(loc, nsURI, localName, "Either fo:table-rows" + " or fo:table-cells may be children of an " + getName() + " but not both"); } } else { invalidChildError(loc, nsURI, localName); } } else { invalidChildError(loc, nsURI, localName); } } /** * If table-cells are used as direct children of a table-body|header|footer * they are replaced in this method by proper table-rows. * @throws FOPException if there's a problem binding the TableRows properties. */ private void convertCellsToRows() throws FOPException { //getLogger().debug("Converting cells to rows..."); List cells = new java.util.ArrayList(childNodes); childNodes.clear(); Iterator i = cells.iterator(); TableRow row = null; while (i.hasNext()) { TableCell cell = (TableCell)i.next(); if (cell.startsRow() && (row != null)) { childNodes.add(row); row = null; } if (row == null) { row = new TableRow(this); PropertyList pList = new StaticPropertyList(row, savedPropertyList); pList.setWritingMode(); row.bind(pList); } row.addReplacedCell(cell); if (cell.endsRow()) { childNodes.add(row); row = null; } } if (row != null) { childNodes.add(row); } } /** * @return the Common Border, Padding, and Background Properties. */ public CommonBorderPaddingBackground getCommonBorderPaddingBackground() { return commonBorderPaddingBackground; } /** * @see org.apache.fop.fo.FObj#getName() */ public String getName() { return "fo:table-body"; } /** * @see org.apache.fop.fo.FObj#getNameId() */ public int getNameId() { return FO_TABLE_BODY; } /** * @param obj table row in question * @return true if the given table row is the first row of this body. */ public boolean isFirst(TableRow obj) { return (childNodes.size() > 0) && (childNodes.get(0) == obj); } /** * @param obj table row in question * @return true if the given table row is the first row of this body. */ public boolean isLast(TableRow obj) { return (childNodes.size() > 0) && (childNodes.get(childNodes.size() - 1) == obj); } }