- /*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
- package org.apache.fop.fo.flow;
-
- // FOP
- import org.apache.fop.fo.*;
- import org.apache.fop.fo.properties.*;
- import org.apache.fop.datatypes.Length;
- import org.apache.fop.area.Area;
- import org.apache.fop.area.inline.InlineArea;
- import org.apache.fop.area.inline.Viewport;
- import org.apache.fop.area.inline.ForeignObject;
- import org.apache.fop.layout.FontState;
- import org.apache.fop.layout.AccessibilityProps;
- import org.apache.fop.layout.AuralProps;
- import org.apache.fop.layout.BorderAndPadding;
- import org.apache.fop.layout.BackgroundProps;
- import org.apache.fop.layout.MarginInlineProps;
- import org.apache.fop.layout.RelativePositionProps;
- import org.apache.fop.apps.FOPException;
- import org.apache.fop.layoutmgr.LayoutManager;
- import org.apache.fop.layoutmgr.LeafNodeLayoutManager;
- import org.apache.fop.layoutmgr.LayoutInfo;
-
- import org.w3c.dom.Document;
-
- import java.awt.geom.Point2D;
- import java.awt.geom.Rectangle2D;
- import java.util.List;
-
- public class InstreamForeignObject extends FObj {
-
- int breakBefore;
- int breakAfter;
- int spaceBefore;
- int spaceAfter;
- int startIndent;
- int endIndent;
-
- Viewport areaCurrent;
-
- /**
- * constructs an instream-foreign-object object (called by Maker).
- *
- * @param parent the parent formatting object
- * @param propertyList the explicit properties of this object
- */
- public InstreamForeignObject(FONode parent) {
- super(parent);
- }
-
- public void addLayoutManager(List list) {
- LeafNodeLayoutManager lm = new LeafNodeLayoutManager(this);
- lm.setCurrentArea(getInlineArea());
- list.add(lm);
- }
-
- /**
- * Get the inline area created by this element.
- */
- protected InlineArea getInlineArea() {
- if (children == null) {
- return areaCurrent;
- }
-
- if (this.children.size() != 1) {
- // error
- return null;
- }
- FONode fo = (FONode)children.get(0);
- if(!(fo instanceof XMLObj)) {
- // error
- return null;
- }
- XMLObj child = (XMLObj)fo;
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Margin Properties-Inline
- MarginInlineProps mProps = propMgr.getMarginInlineProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // viewport size is determined by block-progression-dimension
- // and inline-progression-dimension
-
- // if replaced then use height then ignore block-progression-dimension
- //int h = this.properties.get("height").getLength().mvalue();
-
- // use specified line-height then ignore dimension in height direction
- boolean hasLH = false;//properties.get("line-height").getSpecifiedValue() != null;
-
- Length len;
-
- int bpd = -1;
- int ipd = -1;
- boolean bpdauto = false;
- if(hasLH) {
- bpd = properties.get("line-height").getLength().mvalue();
- } else {
- // this property does not apply when the line-height applies
- // isn't the block-progression-dimension always in the same
- // direction as the line height?
- len = properties.get("block-progression-dimension.optimum").getLength();
- if(!len.isAuto()) {
- bpd = len.mvalue();
- } else {
- len = properties.get("height").getLength();
- if(!len.isAuto()) {
- bpd = len.mvalue();
- }
- }
- }
-
- len = properties.get("inline-progression-dimension.optimum").getLength();
- if(!len.isAuto()) {
- ipd = len.mvalue();
- } else {
- len = properties.get("width").getLength();
- if(!len.isAuto()) {
- ipd = len.mvalue();
- }
- }
-
- // if auto then use the intrinsic size of the content scaled
- // to the content-height and content-width
- int cwidth = -1;
- int cheight = -1;
- len = properties.get("content-width").getLength();
- if(!len.isAuto()) {
- /*if(len.scaleToFit()) {
- if(ipd != -1) {
- cwidth = ipd;
- }
- } else {*/
- cwidth = len.mvalue();
- }
- len = properties.get("content-height").getLength();
- if(!len.isAuto()) {
- /*if(len.scaleToFit()) {
- if(bpd != -1) {
- cwidth = bpd;
- }
- } else {*/
- cheight = len.mvalue();
- }
-
- Point2D csize = new Point2D.Float(cwidth == -1 ? -1 : cwidth / 1000f, cheight == -1 ? -1 : cheight / 1000f);
- Point2D size = child.getDimension(csize);
- if(size == null) {
- // error
- return null;
- }
- if(cwidth == -1) {
- cwidth = (int)size.getX() * 1000;
- }
- if(cheight == -1) {
- cheight = (int)size.getY() * 1000;
- }
- int scaling = properties.get("scaling").getEnum();
- if(scaling == Scaling.UNIFORM) {
- // adjust the larger
- double rat1 = cwidth / (size.getX() * 1000f);
- double rat2 = cheight / (size.getY() * 1000f);
- if(rat1 < rat2) {
- // reduce cheight
- cheight = (int)(rat1 * size.getY() * 1000);
- } else {
- cwidth = (int)(rat2 * size.getX() * 1000);
- }
- }
-
- if(ipd == -1) {
- ipd = cwidth;
- }
- if(bpd == -1) {
- bpd = cheight;
- }
-
- boolean clip = false;
- if(cwidth > ipd || cheight > bpd) {
- int overflow = properties.get("overflow").getEnum();
- if(overflow == Overflow.HIDDEN) {
- clip = true;
- } else if(overflow == Overflow.ERROR_IF_OVERFLOW) {
- getLogger().error("Instream foreign object overflows the viewport");
- clip = true;
- }
- }
-
- int xoffset = 0;
- int yoffset = 0;
- int da = properties.get("display-align").getEnum();
- switch(da) {
- case DisplayAlign.BEFORE:
- break;
- case DisplayAlign.AFTER:
- yoffset = bpd - cheight;
- break;
- case DisplayAlign.CENTER:
- yoffset = (bpd - cheight) / 2;
- break;
- case DisplayAlign.AUTO:
- default:
- break;
- }
-
- int ta = properties.get("text-align").getEnum();
- switch(ta) {
- case TextAlign.CENTER:
- xoffset = (ipd - cwidth) / 2;
- break;
- case TextAlign.END:
- xoffset = ipd - cwidth;
- break;
- case TextAlign.START:
- break;
- case TextAlign.JUSTIFY:
- default:
- break;
- }
- Rectangle2D placement = new Rectangle2D.Float(xoffset, yoffset, cwidth, cheight);
-
- Document doc = child.getDocument();
- String ns = child.getDocumentNamespace();
-
- children = null;
- ForeignObject foreign = new ForeignObject(doc, ns);
-
- areaCurrent = new Viewport(foreign);
- areaCurrent.setWidth(ipd);
- areaCurrent.setHeight(bpd);
- areaCurrent.setContentPosition(placement);
- areaCurrent.setClip(clip);
- areaCurrent.setOffset(0);
- areaCurrent.info = new LayoutInfo();
- areaCurrent.info.alignment = properties.get("vertical-align").getEnum();
- areaCurrent.info.lead = areaCurrent.getHeight();
-
- return areaCurrent;
- }
-
- public boolean generatesInlineAreas() {
- return true;
- }
-
- /*
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Margin Properties-Inline
- MarginInlineProps mProps = propMgr.getMarginInlineProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("alignment-adjust");
- // this.properties.get("alignment-baseline");
- // this.properties.get("baseline-shift");
- // this.properties.get("block-progression-dimension");
- // this.properties.get("content-height");
- // this.properties.get("content-type");
- // this.properties.get("content-width");
- // this.properties.get("display-align");
- // this.properties.get("dominant-baseline");
- // this.properties.get("height");
- setupID();
- // this.properties.get("inline-progression-dimension");
- // this.properties.get("keep-with-next");
- // this.properties.get("keep-with-previous");
- // this.properties.get("line-height");
- // this.properties.get("line-height-shift-adjustment");
- // this.properties.get("overflow");
- // this.properties.get("scaling");
- // this.properties.get("scaling-method");
- // this.properties.get("text-align");
- // this.properties.get("width");
-
- /* retrieve properties *
- int align = this.properties.get("text-align").getEnum();
- int valign = this.properties.get("vertical-align").getEnum();
- int overflow = this.properties.get("overflow").getEnum();
-
- this.breakBefore = this.properties.get("break-before").getEnum();
- this.breakAfter = this.properties.get("break-after").getEnum();
- this.width = this.properties.get("width").getLength().mvalue();
- this.height = this.properties.get("height").getLength().mvalue();
- this.contwidth =
- this.properties.get("content-width").getLength().mvalue();
- this.contheight =
- this.properties.get("content-height").getLength().mvalue();
- this.wauto = this.properties.get("width").getLength().isAuto();
- this.hauto = this.properties.get("height").getLength().isAuto();
- this.cwauto =
- this.properties.get("content-width").getLength().isAuto();
- this.chauto =
- this.properties.get("content-height").getLength().isAuto();
-
- this.startIndent =
- this.properties.get("start-indent").getLength().mvalue();
- this.endIndent =
- this.properties.get("end-indent").getLength().mvalue();
- this.spaceBefore =
- this.properties.get("space-before.optimum").getLength().mvalue();
- this.spaceAfter =
- this.properties.get("space-after.optimum").getLength().mvalue();
-
- this.scaling = this.properties.get("scaling").getEnum();
-
- */
- }
|