org.apache.fop.render.rtf.rtflib.tools.PercentContext Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of fop Show documentation
Show all versions of fop Show documentation
Apache FOP (Formatting Objects Processor) is the world's first print formatter driven by XSL formatting objects (XSL-FO) and the world's first output independent formatter. It is a Java application that reads a formatting object (FO) tree and renders the resulting pages to a specified output. Output formats currently supported include PDF, PCL, PS, AFP, TIFF, PNG, SVG, XML (area tree representation), Print, AWT and TXT. The primary output target is PDF.
/*
* 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: PercentContext.java 1761019 2016-09-16 10:43:45Z ssteiner $ */
package org.apache.fop.render.rtf.rtflib.tools;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.fop.datatypes.LengthBase;
import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.fo.FONode;
import org.apache.fop.fo.FObj;
import org.apache.fop.fo.flow.table.Table;
import org.apache.fop.fo.flow.table.TableColumn;
import org.apache.fop.fo.pagination.PageSequence;
/**
* PercentBaseContext implementation to track base widths for percentage calculations.
*/
public class PercentContext implements PercentBaseContext {
private static Log log = LogFactory.getLog(PercentContext.class);
/** Map containing the FObj and its width */
private Map lengthMap = new java.util.HashMap();
/** Map containing the Tables and their table units */
private Map tableUnitMap = new java.util.HashMap();
/** Variable to check if a base width is set */
private boolean baseWidthSet;
/**
* Returns the available width for a specific FObj
*
* @param lengthBase
* lengthBase not used
* @param fobj
* the FObj
* @return Available Width
*/
public int getBaseLength(int lengthBase, FObj fobj) {
if (fobj == null) {
return 0;
}
// Special handler for TableColumn width specifications, needs to be
// relative to the parent!
if ((fobj instanceof TableColumn) && (fobj.getParent() instanceof FObj)) {
fobj = (FObj) fobj.getParent();
}
switch (lengthBase) {
case LengthBase.CONTAINING_BLOCK_WIDTH:
case LengthBase.PARENT_AREA_WIDTH:
case LengthBase.CONTAINING_REFAREA_WIDTH:
Object width = lengthMap.get(fobj);
if (width != null) {
return Integer.parseInt(width.toString());
} else if (fobj.getParent() != null) {
// If the object itself has no width the parent width will be used
// because it is the base width of this object
width = lengthMap.get(fobj.getParent());
if (width != null) {
return Integer.parseInt(width.toString());
}
}
return 0;
case LengthBase.TABLE_UNITS:
Object unit = tableUnitMap.get(fobj);
if (unit != null) {
return (Integer) unit;
} else if (fobj.getParent() != null) {
// If the object itself has no width the parent width will be used
unit = tableUnitMap.get(fobj.getParent());
if (unit != null) {
return (Integer) unit;
}
}
return 0;
default:
log.error(new Exception("Unsupported base type for LengthBase:" + lengthBase));
return 0;
}
}
/**
* Elements having a width property can call this function if their width is
* calculated in RTFHandler
*
* @param fobj the FObj
* @param width width of the FObj (in millipoints)
*/
public void setDimension(FObj fobj, int width) {
// TODO ACCEPT only objects above for setting a width
if (fobj instanceof PageSequence) {
baseWidthSet = true;
}
// width in mpt
lengthMap.put(fobj, width);
}
/**
* Records the calculated table unit for a given table.
* @param table the table for which the table unit is set
* @param tableUnit the table unit value (in millipoints)
*/
public void setTableUnit(Table table, int tableUnit) {
tableUnitMap.put(table, tableUnit);
}
/**
* Searches for the parent object of fobj.
*/
private Integer findParent(FONode fobj) {
if (fobj.getRoot() != fobj) {
if (lengthMap.containsKey(fobj)) {
return Integer.valueOf(lengthMap.get(fobj).toString());
} else {
return findParent(fobj.getParent());
}
} else {
log.error("Base Value for element " + fobj.getName() + " not found");
return -1;
}
}
/**
* Elements willing to use this context have to register themselves by
* calling this function.
*
* @param fobj the FObj
*/
public void setDimension(FObj fobj) {
if (baseWidthSet) {
Integer width = findParent(fobj.getParent());
if (width != -1) {
lengthMap.put(fobj, width);
}
}
}
}