| /* |
| * 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.fo.flow; |
| |
| import java.util.BitSet; |
| import java.util.List; |
| |
| import org.xml.sax.Locator; |
| |
| import org.apache.fop.apps.FOPException; |
| import org.apache.fop.datatypes.Length; |
| import org.apache.fop.fo.FONode; |
| import org.apache.fop.fo.PropertyList; |
| 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; |
| import org.apache.fop.fo.properties.KeepProperty; |
| import org.apache.fop.fo.properties.LengthRangeProperty; |
| |
| /** |
| * Class modelling the fo:table-row object. |
| */ |
| public class TableRow extends TableFObj { |
| // The value of properties relevant for fo:table-row. |
| private CommonAccessibility commonAccessibility; |
| private LengthRangeProperty blockProgressionDimension; |
| private CommonAural commonAural; |
| private CommonBorderPaddingBackground commonBorderPaddingBackground; |
| private CommonRelativePosition commonRelativePosition; |
| private int breakAfter; |
| private int breakBefore; |
| private Length height; |
| private String id; |
| private KeepProperty keepTogether; |
| private KeepProperty keepWithNext; |
| private KeepProperty keepWithPrevious; |
| private int visibility; |
| // End of property values |
| |
| private boolean setup = false; |
| |
| protected List pendingSpans; |
| protected BitSet usedColumnIndices; |
| private int columnIndex = 1; |
| |
| /** |
| * @param parent FONode that is the parent of this object |
| */ |
| public TableRow(FONode parent) { |
| super(parent); |
| } |
| |
| /** |
| * @see org.apache.fop.fo.FObj#bind(PropertyList) |
| */ |
| public void bind(PropertyList pList) throws FOPException { |
| commonAccessibility = pList.getAccessibilityProps(); |
| blockProgressionDimension |
| = pList.get(PR_BLOCK_PROGRESSION_DIMENSION).getLengthRange(); |
| commonAural = pList.getAuralProps(); |
| commonBorderPaddingBackground = pList.getBorderPaddingBackgroundProps(); |
| commonRelativePosition = pList.getRelativePositionProps(); |
| breakAfter = pList.get(PR_BREAK_AFTER).getEnum(); |
| breakBefore = pList.get(PR_BREAK_BEFORE).getEnum(); |
| id = pList.get(PR_ID).getString(); |
| height = pList.get(PR_HEIGHT).getLength(); |
| keepTogether = pList.get(PR_KEEP_TOGETHER).getKeep(); |
| keepWithNext = pList.get(PR_KEEP_WITH_NEXT).getKeep(); |
| keepWithPrevious = pList.get(PR_KEEP_WITH_PREVIOUS).getKeep(); |
| visibility = pList.get(PR_VISIBILITY).getEnum(); |
| super.bind(pList); |
| } |
| |
| /** |
| * Adds a cell to this row (skips marker handling done by |
| * FObj.addChildNode(). |
| * Used by TableBody during the row building process when only cells are |
| * used as direct children of a table-body/header/footer. |
| * @param cell cell to add. |
| */ |
| protected void addReplacedCell(TableCell cell) { |
| if (childNodes == null) { |
| childNodes = new java.util.ArrayList(); |
| } |
| childNodes.add(cell); |
| } |
| |
| /** |
| * @see org.apache.fop.fo.FONode#startOfNode |
| */ |
| protected void startOfNode() throws FOPException { |
| pendingSpans = ((TableBody) parent).pendingSpans; |
| usedColumnIndices = ((TableBody) parent).usedColumnIndices; |
| while (usedColumnIndices.get(columnIndex - 1)) { |
| columnIndex++; |
| } |
| |
| checkId(id); |
| getFOEventHandler().startRow(this); |
| if (((TableBody) parent).isFirst(this) |
| && getTable().columns == null ) { |
| if (pendingSpans == null) { |
| pendingSpans = new java.util.ArrayList(); |
| } |
| } |
| } |
| |
| /** |
| * @see org.apache.fop.fo.FONode#endOfNode |
| */ |
| protected void endOfNode() throws FOPException { |
| if (childNodes == null) { |
| missingChildElementError("(table-cell+)"); |
| } |
| if (((TableBody) parent).isFirst(this) |
| && getTable().columns == null ) { |
| //force parent body's pendingSpans |
| //to the one accumulated after processing this row |
| ((TableBody) parent).pendingSpans = pendingSpans; |
| } |
| ((TableBody) parent).resetColumnIndex(); |
| columnIndex = 1; |
| //release references |
| pendingSpans = null; |
| usedColumnIndices = null; |
| getFOEventHandler().endRow(this); |
| } |
| |
| /** |
| * @see org.apache.fop.fo.FONode#validateChildNode(Locator, String, String) |
| * XSL Content Model: (table-cell+) |
| */ |
| protected void validateChildNode(Locator loc, String nsURI, |
| String localName) |
| throws ValidationException { |
| if (!(FO_URI.equals(nsURI) && localName.equals("table-cell"))) { |
| invalidChildError(loc, nsURI, localName); |
| } |
| } |
| |
| /** |
| * @return the "id" property. |
| */ |
| public String getId() { |
| return id; |
| } |
| |
| /** @return the "break-after" property. */ |
| public int getBreakAfter() { |
| return breakAfter; |
| } |
| |
| /** @return the "break-before" property. */ |
| public int getBreakBefore() { |
| return breakBefore; |
| } |
| |
| /** @return the "keep-with-previous" property. */ |
| public KeepProperty getKeepWithPrevious() { |
| return keepWithPrevious; |
| } |
| |
| /** @return the "keep-with-next" property. */ |
| public KeepProperty getKeepWithNext() { |
| return keepWithNext; |
| } |
| |
| /** @return the "keep-together" property. */ |
| public KeepProperty getKeepTogether() { |
| return keepTogether; |
| } |
| |
| /** |
| * Convenience method to check if a keep-together |
| * constraint is specified. |
| * @return true if keep-together is active. |
| */ |
| public boolean mustKeepTogether() { |
| return !getKeepTogether().getWithinPage().isAuto() |
| || !getKeepTogether().getWithinColumn().isAuto(); |
| } |
| |
| /** |
| * Convenience method to check if a keep-with-next |
| * constraint is specified. |
| * @return true if keep-with-next is active. |
| */ |
| public boolean mustKeepWithNext() { |
| return !getKeepWithNext().getWithinPage().isAuto() |
| || !getKeepWithNext().getWithinColumn().isAuto(); |
| } |
| |
| /** |
| * Convenience method to check if a keep-with-previous |
| * constraint is specified. |
| * @return true if keep-with-previous is active. |
| */ |
| public boolean mustKeepWithPrevious() { |
| return !getKeepWithPrevious().getWithinPage().isAuto() |
| || !getKeepWithPrevious().getWithinColumn().isAuto(); |
| } |
| |
| /** |
| * @return the "block-progression-dimension" property. |
| */ |
| public LengthRangeProperty getBlockProgressionDimension() { |
| return blockProgressionDimension; |
| } |
| |
| /** |
| * @return the "height" property. |
| */ |
| public Length getHeight() { |
| return height; |
| } |
| |
| /** |
| * @return the Common Border, Padding, and Background Properties. |
| */ |
| public CommonBorderPaddingBackground getCommonBorderPaddingBackground() { |
| return commonBorderPaddingBackground; |
| } |
| |
| /** @see org.apache.fop.fo.FONode#getLocalName() */ |
| public String getLocalName() { |
| return "table-row"; |
| } |
| |
| /** @see org.apache.fop.fo.FObj#getNameId() */ |
| public int getNameId() { |
| return FO_TABLE_ROW; |
| } |
| |
| /** |
| * Returns the current column index of the TableRow |
| * |
| * @return the next column number to use |
| */ |
| public int getCurrentColumnIndex() { |
| return columnIndex; |
| } |
| |
| /** |
| * Sets the current column index to a specific value |
| * in case a column-number was explicitly specified |
| * (used by ColumnNumberPropertyMaker.make()) |
| * |
| * @param newIndex new value for column index |
| */ |
| public void setCurrentColumnIndex(int newIndex) { |
| columnIndex = newIndex; |
| } |
| |
| /** |
| * Checks whether a given column-number is already in use |
| * for the current row (used by TableCell.bind()); |
| * |
| * @param colNr the column-number to check |
| * @return true if column-number is already occupied |
| */ |
| public boolean isColumnNumberUsed(int colNr) { |
| return usedColumnIndices.get(colNr - 1); |
| } |
| |
| /** |
| * @see org.apache.fop.fo.flow.TableFObj#flagColumnIndices(int, int) |
| */ |
| protected void flagColumnIndices(int start, int end) { |
| for (int i = start; i < end; i++) { |
| usedColumnIndices.set(i); |
| } |
| // update columnIndex for the next cell |
| while (usedColumnIndices.get(columnIndex - 1)) { |
| columnIndex++; |
| } |
| } |
| |
| /** |
| * @see org.apache.fop.fo.flow.TableFObj#existsUsedColumnIndices() |
| */ |
| protected boolean existsUsedColumnIndices() { |
| return (usedColumnIndices != null); |
| } |
| } |