diff options
author | eschaeffer <eschaeffer@unknown> | 2001-01-23 16:01:48 +0000 |
---|---|---|
committer | eschaeffer <eschaeffer@unknown> | 2001-01-23 16:01:48 +0000 |
commit | de9a93cb77ffc902fdf480c1b679d553c87b94e0 (patch) | |
tree | c73f89c04a506cc03896273cd7bd079cf587a582 /src/org/apache/fop/fo | |
parent | b958535ff0808ea3faa2841a6a741f37ae8c1cd8 (diff) | |
download | xmlgraphics-fop-de9a93cb77ffc902fdf480c1b679d553c87b94e0.tar.gz xmlgraphics-fop-de9a93cb77ffc902fdf480c1b679d553c87b94e0.zip |
add small-caps support.
PR:
Obtained from:
Submitted by:
Reviewed by:
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193977 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/org/apache/fop/fo')
-rw-r--r-- | src/org/apache/fop/fo/FOText.java | 217 | ||||
-rw-r--r-- | src/org/apache/fop/fo/flow/Block.java | 827 |
2 files changed, 526 insertions, 518 deletions
diff --git a/src/org/apache/fop/fo/FOText.java b/src/org/apache/fop/fo/FOText.java index 19210c03e..debc06e14 100644 --- a/src/org/apache/fop/fo/FOText.java +++ b/src/org/apache/fop/fo/FOText.java @@ -1,35 +1,35 @@ /*-- $Id$ -- ============================================================================ - The Apache Software License, Version 1.1 + The Apache Software License, Version 1.1 ============================================================================ - Copyright (C) 1999 The Apache Software Foundation. All rights reserved. + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. Redistribution and use in source and binary forms, with or without modifica- tion, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. + this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. 3. The end-user documentation included with the redistribution, if any, must - include the following acknowledgment: "This product includes software - developed by the Apache Software Foundation (http://www.apache.org/)." - Alternately, this acknowledgment may appear in the software itself, if - and wherever such third-party acknowledgments normally appear. + include the following acknowledgment: "This product includes software + developed by the Apache Software Foundation (http://www.apache.org/)." + Alternately, this acknowledgment may appear in the software itself, if + and wherever such third-party acknowledgments normally appear. 4. The names "FOP" and "Apache Software Foundation" must not be used to - endorse or promote products derived from this software without prior - written permission. For written permission, please contact - apache@apache.org. + endorse or promote products derived from this software without prior + written permission. For written permission, please contact + apache@apache.org. 5. Products derived from this software may not be called "Apache", nor may - "Apache" appear in their name, without prior written permission of the - Apache Software Foundation. + "Apache" appear in their name, without prior written permission of the + Apache Software Foundation. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND @@ -65,92 +65,95 @@ import org.apache.fop.apps.FOPException; */ public class FOText extends FONode { - protected char[] ca; - protected int start; - protected int length; - - FontState fs; - float red; - float green; - float blue; - int wrapOption; - int whiteSpaceCollapse; - - // Textdecoration - protected boolean underlined = false; - protected boolean overlined = false; - protected boolean lineThrough = false; - - - public FOText(char[] chars, int s, int e, FObj parent) { - super(parent); - this.start = 0; - this.ca = new char[e - s]; - for (int i = s; i < e; i++) - this.ca[i - s] = chars[i]; - this.length = e - s; - } - - public void setUnderlined(boolean ul) { - this.underlined = ul; - } - - public boolean willCreateArea() - { - this.whiteSpaceCollapse = this.parent.properties.get( - "white-space-collapse").getEnum(); - if(this.whiteSpaceCollapse == WhiteSpaceCollapse.FALSE && length > 0) { - return true; - } - for (int i = start; i < start + length; i++) { - char ch = ca[i]; - if (!((ch == ' ') || (ch == '\n') || (ch == '\r') || - (ch == '\t'))) { // whitespace - return true; - } - } - return false; - } - - public Status layout(Area area) throws FOPException { - if (!(area instanceof BlockArea)) { - MessageHandler.errorln("WARNING: text outside block area" + - new String(ca, start, length)); - return new Status(Status.OK); - } - if (this.marker == START) { - String fontFamily = - this.parent.properties.get("font-family").getString(); - String fontStyle = - this.parent.properties.get("font-style").getString(); - String fontWeight = - this.parent.properties.get("font-weight").getString(); - int fontSize = this.parent.properties.get( - "font-size").getLength().mvalue(); - - this.fs = new FontState(area.getFontInfo(), fontFamily, - fontStyle, fontWeight, fontSize); - - ColorType c = - this.parent.properties.get("color").getColorType(); - this.red = c.red(); - this.green = c.green(); - this.blue = c.blue(); - - this.wrapOption = - this.parent.properties.get("wrap-option").getEnum(); - this.whiteSpaceCollapse = this.parent.properties.get( - "white-space-collapse").getEnum(); - - this.marker = this.start; - } - int orig_start = this.marker; - this.marker = ((BlockArea) area).addText(fs, red, green, blue, - wrapOption, this.getLinkSet(), whiteSpaceCollapse, ca, - this.marker, length, underlined); - if (this.marker == -1) { - - + protected char[] ca; + protected int start; + protected int length; + + FontState fs; + float red; + float green; + float blue; + int wrapOption; + int whiteSpaceCollapse; + + // Textdecoration + protected boolean underlined = false; + protected boolean overlined = false; + protected boolean lineThrough = false; + + + public FOText(char[] chars, int s, int e, FObj parent) { + super(parent); + this.start = 0; + this.ca = new char[e - s]; + for (int i = s; i < e; i++) + this.ca[i - s] = chars[i]; + this.length = e - s; + } + + public void setUnderlined(boolean ul) { + this.underlined = ul; + } + + public boolean willCreateArea() + { + this.whiteSpaceCollapse = this.parent.properties.get( + "white-space-collapse").getEnum(); + if(this.whiteSpaceCollapse == WhiteSpaceCollapse.FALSE && length > 0) { + return true; + } + for (int i = start; i < start + length; i++) { + char ch = ca[i]; + if (!((ch == ' ') || (ch == '\n') || (ch == '\r') || + (ch == '\t'))) { // whitespace + return true; + } + } + return false; + } + + public Status layout(Area area) throws FOPException { + if (!(area instanceof BlockArea)) { + MessageHandler.errorln("WARNING: text outside block area" + + new String(ca, start, length)); + return new Status(Status.OK); + } + if (this.marker == START) { + String fontFamily = + this.parent.properties.get("font-family").getString(); + String fontStyle = + this.parent.properties.get("font-style").getString(); + String fontWeight = + this.parent.properties.get("font-weight").getString(); + int fontSize = this.parent.properties.get( + "font-size").getLength().mvalue(); + // font-variant support + // added by Eric SCHAEFFER + int fontVariant = this.parent.properties.get("font-variant").getEnum(); + + this.fs = new FontState(area.getFontInfo(), fontFamily, + fontStyle, fontWeight, fontSize, fontVariant); + + ColorType c = + this.parent.properties.get("color").getColorType(); + this.red = c.red(); + this.green = c.green(); + this.blue = c.blue(); + + this.wrapOption = + this.parent.properties.get("wrap-option").getEnum(); + this.whiteSpaceCollapse = this.parent.properties.get( + "white-space-collapse").getEnum(); + + this.marker = this.start; + } + int orig_start = this.marker; + this.marker = ((BlockArea) area).addText(fs, red, green, blue, + wrapOption, this.getLinkSet(), whiteSpaceCollapse, ca, + this.marker, length, underlined); + if (this.marker == -1) { + + // commented out by Hani Elabed, 11/28/2000 // if this object has been laid out // successfully, leave it alone.... @@ -161,11 +164,11 @@ public class FOText extends FONode { // see LineArea.addText() //this.marker = 0; - return new Status(Status.OK); - } else if (this.marker != orig_start) { - return new Status(Status.AREA_FULL_SOME); - } else { - return new Status(Status.AREA_FULL_NONE); - } - } + return new Status(Status.OK); + } else if (this.marker != orig_start) { + return new Status(Status.AREA_FULL_SOME); + } else { + return new Status(Status.AREA_FULL_NONE); + } + } } diff --git a/src/org/apache/fop/fo/flow/Block.java b/src/org/apache/fop/fo/flow/Block.java index b4c10d109..f5f5f0417 100644 --- a/src/org/apache/fop/fo/flow/Block.java +++ b/src/org/apache/fop/fo/flow/Block.java @@ -1,35 +1,35 @@ /*-- $Id$ -- ============================================================================ - The Apache Software License, Version 1.1 + The Apache Software License, Version 1.1 ============================================================================ - Copyright (C) 1999 The Apache Software Foundation. All rights reserved. + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. Redistribution and use in source and binary forms, with or without modifica- tion, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. + this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. 3. The end-user documentation included with the redistribution, if any, must - include the following acknowledgment: "This product includes software - developed by the Apache Software Foundation (http://www.apache.org/)." - Alternately, this acknowledgment may appear in the software itself, if - and wherever such third-party acknowledgments normally appear. + include the following acknowledgment: "This product includes software + developed by the Apache Software Foundation (http://www.apache.org/)." + Alternately, this acknowledgment may appear in the software itself, if + and wherever such third-party acknowledgments normally appear. 4. The names "FOP" and "Apache Software Foundation" must not be used to - endorse or promote products derived from this software without prior - written permission. For written permission, please contact - apache@apache.org. + endorse or promote products derived from this software without prior + written permission. For written permission, please contact + apache@apache.org. 5. Products derived from this software may not be called "Apache", nor may - "Apache" appear in their name, without prior written permission of the - Apache Software Foundation. + "Apache" appear in their name, without prior written permission of the + Apache Software Foundation. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND @@ -61,402 +61,407 @@ import org.apache.fop.apps.FOPException; public class Block extends FObjMixed { - public static class Maker extends FObj.Maker { - public FObj make(FObj parent, - PropertyList propertyList) throws FOPException { - return new Block(parent, propertyList); - } - } - - public static FObj.Maker maker() { - return new Block.Maker(); - } - - FontState fs; - int align; - int alignLast; - int breakBefore; - int breakAfter; - int lineHeight; - int startIndent; - int endIndent; - int spaceBefore; - int spaceAfter; - int textIndent; - int keepWithNext; - ColorType backgroundColor; - int paddingTop; - int paddingBottom; - int paddingLeft; - int paddingRight; - int blockWidows; - int blockOrphans; - - String id; - - ColorType borderTopColor; - int borderTopWidth; - int borderTopStyle; - ColorType borderBottomColor; - int borderBottomWidth; - int borderBottomStyle; - ColorType borderLeftColor; - int borderLeftWidth; - int borderLeftStyle; - ColorType borderRightColor; - int borderRightWidth; - int borderRightStyle; - - int hyphenate; - char hyphenationChar; - int hyphenationPushCharacterCount; - int hyphenationRemainCharacterCount; - String language; - String country; + public static class Maker extends FObj.Maker { + public FObj make(FObj parent, + PropertyList propertyList) throws FOPException { + return new Block(parent, propertyList); + } + } + + public static FObj.Maker maker() { + return new Block.Maker(); + } + + FontState fs; + int align; + int alignLast; + int breakBefore; + int breakAfter; + int lineHeight; + int startIndent; + int endIndent; + int spaceBefore; + int spaceAfter; + int textIndent; + int keepWithNext; + ColorType backgroundColor; + int paddingTop; + int paddingBottom; + int paddingLeft; + int paddingRight; + int blockWidows; + int blockOrphans; + + String id; + + ColorType borderTopColor; + int borderTopWidth; + int borderTopStyle; + ColorType borderBottomColor; + int borderBottomWidth; + int borderBottomStyle; + ColorType borderLeftColor; + int borderLeftWidth; + int borderLeftStyle; + ColorType borderRightColor; + int borderRightWidth; + int borderRightStyle; + + int hyphenate; + char hyphenationChar; + int hyphenationPushCharacterCount; + int hyphenationRemainCharacterCount; + String language; + String country; int span; - - BlockArea blockArea; - - // this may be helpful on other FOs too - boolean anythingLaidOut = false; - - public Block(FObj parent, PropertyList propertyList) { - super(parent, propertyList); - this.name = "fo:block"; - this.span = this.properties.get("span").getEnum(); - } - - public Status layout(Area area) throws FOPException { - // MessageHandler.error(" b:LAY[" + marker + "] "); - - - if (this.marker == BREAK_AFTER) { - return new Status(Status.OK); - } - - if (this.marker == START) { - String fontFamily = - this.properties.get("font-family").getString(); - String fontStyle = - this.properties.get("font-style").getString(); - String fontWeight = - this.properties.get("font-weight").getString(); - int fontSize = - this.properties.get("font-size").getLength().mvalue(); - - this.fs = new FontState(area.getFontInfo(), fontFamily, - fontStyle, fontWeight, fontSize); - this.align = this.properties.get("text-align").getEnum(); - this.alignLast = - this.properties.get("text-align-last").getEnum(); - this.breakBefore = - this.properties.get("break-before").getEnum(); - this.breakAfter = this.properties.get("break-after").getEnum(); - this.lineHeight = this.properties.get( - "line-height").getLength().mvalue(); - 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.textIndent = this.properties.get( - "text-indent").getLength().mvalue(); - this.keepWithNext = - this.properties.get("keep-with-next").getEnum(); - this.backgroundColor = this.properties.get( - "background-color").getColorType(); - this.paddingTop = - this.properties.get("padding").getLength().mvalue(); - - this.paddingLeft = this.paddingTop; - this.paddingRight = this.paddingTop; - this.paddingBottom = this.paddingTop; - if (this.paddingTop == 0) { - this.paddingTop = this.properties.get( - "padding-top").getLength().mvalue(); - this.paddingLeft = this.properties.get( - "padding-left").getLength().mvalue(); - this.paddingBottom = this.properties.get( - "padding-bottom").getLength().mvalue(); - this.paddingRight = this.properties.get( - "padding-right").getLength().mvalue(); - } - this.borderTopColor = - this.properties.get("border-color").getColorType(); - this.borderBottomColor = this.borderTopColor; - this.borderLeftColor = this.borderTopColor; - this.borderRightColor = this.borderTopColor; - if (this.borderTopColor == null) { - this.borderTopColor = this.properties.get( - "border-top-color").getColorType(); - this.borderBottomColor = this.properties.get( - "border-bottom-color").getColorType(); - this.borderLeftColor = this.properties.get( - "border-left-color").getColorType(); - this.borderRightColor = this.properties.get( - "border-right-color").getColorType(); - } - this.borderTopWidth = this.properties.get( - "border-width").getLength().mvalue(); - this.borderBottomWidth = this.borderTopWidth; - this.borderLeftWidth = this.borderTopWidth; - this.borderRightWidth = this.borderTopWidth; - if (this.borderTopWidth == 0) { - this.borderTopWidth = this.properties.get( - "border-top-width").getLength().mvalue(); - this.borderBottomWidth = this.properties.get( - "border-bottom-width").getLength().mvalue(); - this.borderLeftWidth = this.properties.get( - "border-left-width").getLength().mvalue(); - this.borderRightWidth = this.properties.get( - "border-right-width").getLength().mvalue(); - } - this.borderTopStyle = - this.properties.get("border-style").getEnum(); - this.borderBottomStyle = this.borderTopStyle; - this.borderLeftStyle = this.borderTopStyle; - this.borderRightStyle = this.borderTopStyle; - if (this.borderTopStyle == 0) { - this.borderTopStyle = - this.properties.get("border-top-style").getEnum(); - this.borderBottomStyle = this.properties.get( - "border-bottom-style").getEnum(); - this.borderLeftStyle = this.properties.get( - "border-left-style").getEnum(); - this.borderRightStyle = this.properties.get( - "border-right-style").getEnum(); - } - this.blockWidows = - this.properties.get("widows").getNumber().intValue(); - this.blockOrphans = - this.properties.get("orphans").getNumber().intValue(); - - this.hyphenate = this.properties.get("hyphenate").getEnum(); - this.hyphenationChar = this.properties.get("hyphenation-character").getCharacter(); - this.hyphenationPushCharacterCount = this.properties.get( - "hyphenation-push-character-count").getNumber(). - intValue(); - this.hyphenationRemainCharacterCount = this.properties.get( - "hyphenation-remain-character-count").getNumber(). - intValue(); - this.language = this.properties.get("language").getString(); - this.country = this.properties.get("country").getString(); - - this.id = this.properties.get("id").getString(); - - if (area instanceof BlockArea) { - area.end(); - } - if (this.isInLabel) { - startIndent += bodyIndent; - endIndent += (area.getAllocationWidth() - - distanceBetweenStarts - startIndent) + - labelSeparation; - } else if (this.isInListBody) { - startIndent += bodyIndent + distanceBetweenStarts; - } - - if(area.getIDReferences() != null) - area.getIDReferences().createID(id); - - this.marker = 0; - - if (breakBefore == BreakBefore.PAGE) { - return new Status(Status.FORCE_PAGE_BREAK); - } - - if (breakBefore == BreakBefore.ODD_PAGE) { - return new Status(Status.FORCE_PAGE_BREAK_ODD); - } - - if (breakBefore == BreakBefore.EVEN_PAGE) { - return new Status(Status.FORCE_PAGE_BREAK_EVEN); - } - - if (breakBefore == BreakBefore.COLUMN) { - return new Status(Status.FORCE_COLUMN_BREAK); - } - - int numChildren = this.children.size(); - for (int i = 0; i < numChildren; i++) { - FONode fo = (FONode) children.elementAt(i); - if (fo instanceof FOText) { - if (((FOText) fo).willCreateArea()) { - fo.setWidows(blockWidows); - break; - } else { - children.removeElementAt(i); - numChildren = this.children.size(); - i--; - } - } else { - fo.setWidows(blockWidows); - break; - } - } - - for (int i = numChildren - 1; i >= 0; i--) { - FONode fo = (FONode) children.elementAt(i); - if (fo instanceof FOText) { - if (((FOText) fo).willCreateArea()) { - fo.setOrphans(blockOrphans); - break; - } - } else { - fo.setOrphans(blockOrphans); - break; - } - } - } - - if ((spaceBefore != 0) && (this.marker == 0)) { - area.addDisplaySpace(spaceBefore); - } - - if (anythingLaidOut) { - this.textIndent = 0; - } - - if (marker == 0 && area.getIDReferences() != null) { - area.getIDReferences().configureID(id, area); - } - - int spaceLeft = area.spaceLeft(); - this.blockArea = new BlockArea(fs, area.getAllocationWidth(), - area.spaceLeft(), startIndent, endIndent, textIndent, - align, alignLast, lineHeight); - blockArea.setPage(area.getPage()); - blockArea.setBackgroundColor(backgroundColor); - blockArea.setPadding(paddingTop, paddingLeft, paddingBottom, - paddingRight); - blockArea.setBorderStyle(borderTopStyle, borderLeftStyle, - borderBottomStyle, borderRightStyle); - blockArea.setBorderWidth(borderTopWidth, borderLeftWidth, - borderBottomWidth, borderRightWidth); - blockArea.setBorderColor(borderTopColor, borderLeftColor, - borderBottomColor, borderRightColor); - blockArea.setHyphenation(language, country, hyphenate, - hyphenationChar, hyphenationPushCharacterCount, - hyphenationRemainCharacterCount); - blockArea.start(); - - blockArea.setAbsoluteHeight(area.getAbsoluteHeight()); - blockArea.setIDReferences(area.getIDReferences()); - - blockArea.setTableCellXOffset(area.getTableCellXOffset()); - - int numChildren = this.children.size(); - for (int i = this.marker; i < numChildren; i++) { - FONode fo = (FONode) children.elementAt(i); - if (this.isInListBody) { - fo.setIsInListBody(); - fo.setDistanceBetweenStarts(this.distanceBetweenStarts); - fo.setBodyIndent(this.bodyIndent); - } - Status status; - if ((status = fo.layout(blockArea)).isIncomplete()) { - this.marker = i; - // this block was modified by - // Hani Elabed 11/27/2000 - //if ((i != 0) && (status.getCode() == Status.AREA_FULL_NONE)) - //{ - // status = new Status(Status.AREA_FULL_SOME); - //} - - // new block to replace the one above - // Hani Elabed 11/27/2000 - if (status.getCode() == Status.AREA_FULL_NONE) { - // something has already been laid out - if ((i != 0)) { - status = new Status(Status.AREA_FULL_SOME); - area.addChild(blockArea); - area.setMaxHeight(area.getMaxHeight() - spaceLeft + blockArea.getMaxHeight()); - area.increaseHeight(blockArea.getHeight()); - area.setAbsoluteHeight( - blockArea.getAbsoluteHeight()); - anythingLaidOut = true; - - return status; - } else // i == 0 nothing was laid out.. - { - anythingLaidOut = false; - return status; - } - } - - //blockArea.end(); - area.addChild(blockArea); - area.setMaxHeight(area.getMaxHeight() - spaceLeft + blockArea.getMaxHeight()); - area.increaseHeight(blockArea.getHeight()); - area.setAbsoluteHeight(blockArea.getAbsoluteHeight()); - anythingLaidOut = true; - return status; - } - anythingLaidOut = true; - } - - blockArea.end(); - area.addChild(blockArea); - - /* should this be combined into above? */ - area.increaseHeight(blockArea.getHeight()); - - area.setAbsoluteHeight(blockArea.getAbsoluteHeight()); - - if (spaceAfter != 0) { - area.addDisplaySpace(spaceAfter); - } - - if (area instanceof BlockArea) { - area.start(); - } - - if (breakAfter == BreakAfter.PAGE) { - this.marker = BREAK_AFTER; - return new Status(Status.FORCE_PAGE_BREAK); - } - - if (breakAfter == BreakAfter.ODD_PAGE) { - this.marker = BREAK_AFTER; - return new Status(Status.FORCE_PAGE_BREAK_ODD); - } - - if (breakAfter == BreakAfter.EVEN_PAGE) { - this.marker = BREAK_AFTER; - return new Status(Status.FORCE_PAGE_BREAK_EVEN); - } - - if (breakAfter == BreakAfter.COLUMN) { - this.marker = BREAK_AFTER; - return new Status(Status.FORCE_COLUMN_BREAK); - } - - if (keepWithNext != 0) { - return new Status(Status.KEEP_WITH_NEXT); - } - - //MessageHandler.error(" b:OK" + marker + " "); - return new Status(Status.OK); - } - - public int getAreaHeight() { - return blockArea.getHeight(); - } - - - /** - * Return the content width of the boxes generated by this FO. - */ - public int getContentWidth() { - if (blockArea != null) - return blockArea.getContentWidth(); //getAllocationWidth()?? - else return 0; // not laid out yet - } - - public int getSpan() { - return this.span; - } + + BlockArea blockArea; + + // this may be helpful on other FOs too + boolean anythingLaidOut = false; + + public Block(FObj parent, PropertyList propertyList) { + super(parent, propertyList); + this.name = "fo:block"; + this.span = this.properties.get("span").getEnum(); + } + + public Status layout(Area area) throws FOPException { + // MessageHandler.error(" b:LAY[" + marker + "] "); + + + if (this.marker == BREAK_AFTER) { + return new Status(Status.OK); + } + + if (this.marker == START) { + String fontFamily = + this.properties.get("font-family").getString(); + String fontStyle = + this.properties.get("font-style").getString(); + String fontWeight = + this.properties.get("font-weight").getString(); + int fontSize = + this.properties.get("font-size").getLength().mvalue(); + + // font-variant support + // added by Eric SCHAEFFER + int fontVariant = + this.properties.get("font-variant").getEnum(); + + this.fs = new FontState(area.getFontInfo(), fontFamily, + fontStyle, fontWeight, fontSize, fontVariant); + this.align = this.properties.get("text-align").getEnum(); + this.alignLast = + this.properties.get("text-align-last").getEnum(); + this.breakBefore = + this.properties.get("break-before").getEnum(); + this.breakAfter = this.properties.get("break-after").getEnum(); + this.lineHeight = this.properties.get( + "line-height").getLength().mvalue(); + 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.textIndent = this.properties.get( + "text-indent").getLength().mvalue(); + this.keepWithNext = + this.properties.get("keep-with-next").getEnum(); + this.backgroundColor = this.properties.get( + "background-color").getColorType(); + this.paddingTop = + this.properties.get("padding").getLength().mvalue(); + + this.paddingLeft = this.paddingTop; + this.paddingRight = this.paddingTop; + this.paddingBottom = this.paddingTop; + if (this.paddingTop == 0) { + this.paddingTop = this.properties.get( + "padding-top").getLength().mvalue(); + this.paddingLeft = this.properties.get( + "padding-left").getLength().mvalue(); + this.paddingBottom = this.properties.get( + "padding-bottom").getLength().mvalue(); + this.paddingRight = this.properties.get( + "padding-right").getLength().mvalue(); + } + this.borderTopColor = + this.properties.get("border-color").getColorType(); + this.borderBottomColor = this.borderTopColor; + this.borderLeftColor = this.borderTopColor; + this.borderRightColor = this.borderTopColor; + if (this.borderTopColor == null) { + this.borderTopColor = this.properties.get( + "border-top-color").getColorType(); + this.borderBottomColor = this.properties.get( + "border-bottom-color").getColorType(); + this.borderLeftColor = this.properties.get( + "border-left-color").getColorType(); + this.borderRightColor = this.properties.get( + "border-right-color").getColorType(); + } + this.borderTopWidth = this.properties.get( + "border-width").getLength().mvalue(); + this.borderBottomWidth = this.borderTopWidth; + this.borderLeftWidth = this.borderTopWidth; + this.borderRightWidth = this.borderTopWidth; + if (this.borderTopWidth == 0) { + this.borderTopWidth = this.properties.get( + "border-top-width").getLength().mvalue(); + this.borderBottomWidth = this.properties.get( + "border-bottom-width").getLength().mvalue(); + this.borderLeftWidth = this.properties.get( + "border-left-width").getLength().mvalue(); + this.borderRightWidth = this.properties.get( + "border-right-width").getLength().mvalue(); + } + this.borderTopStyle = + this.properties.get("border-style").getEnum(); + this.borderBottomStyle = this.borderTopStyle; + this.borderLeftStyle = this.borderTopStyle; + this.borderRightStyle = this.borderTopStyle; + if (this.borderTopStyle == 0) { + this.borderTopStyle = + this.properties.get("border-top-style").getEnum(); + this.borderBottomStyle = this.properties.get( + "border-bottom-style").getEnum(); + this.borderLeftStyle = this.properties.get( + "border-left-style").getEnum(); + this.borderRightStyle = this.properties.get( + "border-right-style").getEnum(); + } + this.blockWidows = + this.properties.get("widows").getNumber().intValue(); + this.blockOrphans = + this.properties.get("orphans").getNumber().intValue(); + + this.hyphenate = this.properties.get("hyphenate").getEnum(); + this.hyphenationChar = this.properties.get("hyphenation-character").getCharacter(); + this.hyphenationPushCharacterCount = this.properties.get( + "hyphenation-push-character-count").getNumber(). + intValue(); + this.hyphenationRemainCharacterCount = this.properties.get( + "hyphenation-remain-character-count").getNumber(). + intValue(); + this.language = this.properties.get("language").getString(); + this.country = this.properties.get("country").getString(); + + this.id = this.properties.get("id").getString(); + + if (area instanceof BlockArea) { + area.end(); + } + if (this.isInLabel) { + startIndent += bodyIndent; + endIndent += (area.getAllocationWidth() - + distanceBetweenStarts - startIndent) + + labelSeparation; + } else if (this.isInListBody) { + startIndent += bodyIndent + distanceBetweenStarts; + } + + if(area.getIDReferences() != null) + area.getIDReferences().createID(id); + + this.marker = 0; + + if (breakBefore == BreakBefore.PAGE) { + return new Status(Status.FORCE_PAGE_BREAK); + } + + if (breakBefore == BreakBefore.ODD_PAGE) { + return new Status(Status.FORCE_PAGE_BREAK_ODD); + } + + if (breakBefore == BreakBefore.EVEN_PAGE) { + return new Status(Status.FORCE_PAGE_BREAK_EVEN); + } + + if (breakBefore == BreakBefore.COLUMN) { + return new Status(Status.FORCE_COLUMN_BREAK); + } + + int numChildren = this.children.size(); + for (int i = 0; i < numChildren; i++) { + FONode fo = (FONode) children.elementAt(i); + if (fo instanceof FOText) { + if (((FOText) fo).willCreateArea()) { + fo.setWidows(blockWidows); + break; + } else { + children.removeElementAt(i); + numChildren = this.children.size(); + i--; + } + } else { + fo.setWidows(blockWidows); + break; + } + } + + for (int i = numChildren - 1; i >= 0; i--) { + FONode fo = (FONode) children.elementAt(i); + if (fo instanceof FOText) { + if (((FOText) fo).willCreateArea()) { + fo.setOrphans(blockOrphans); + break; + } + } else { + fo.setOrphans(blockOrphans); + break; + } + } + } + + if ((spaceBefore != 0) && (this.marker == 0)) { + area.addDisplaySpace(spaceBefore); + } + + if (anythingLaidOut) { + this.textIndent = 0; + } + + if (marker == 0 && area.getIDReferences() != null) { + area.getIDReferences().configureID(id, area); + } + + int spaceLeft = area.spaceLeft(); + this.blockArea = new BlockArea(fs, area.getAllocationWidth(), + area.spaceLeft(), startIndent, endIndent, textIndent, + align, alignLast, lineHeight); + blockArea.setPage(area.getPage()); + blockArea.setBackgroundColor(backgroundColor); + blockArea.setPadding(paddingTop, paddingLeft, paddingBottom, + paddingRight); + blockArea.setBorderStyle(borderTopStyle, borderLeftStyle, + borderBottomStyle, borderRightStyle); + blockArea.setBorderWidth(borderTopWidth, borderLeftWidth, + borderBottomWidth, borderRightWidth); + blockArea.setBorderColor(borderTopColor, borderLeftColor, + borderBottomColor, borderRightColor); + blockArea.setHyphenation(language, country, hyphenate, + hyphenationChar, hyphenationPushCharacterCount, + hyphenationRemainCharacterCount); + blockArea.start(); + + blockArea.setAbsoluteHeight(area.getAbsoluteHeight()); + blockArea.setIDReferences(area.getIDReferences()); + + blockArea.setTableCellXOffset(area.getTableCellXOffset()); + + int numChildren = this.children.size(); + for (int i = this.marker; i < numChildren; i++) { + FONode fo = (FONode) children.elementAt(i); + if (this.isInListBody) { + fo.setIsInListBody(); + fo.setDistanceBetweenStarts(this.distanceBetweenStarts); + fo.setBodyIndent(this.bodyIndent); + } + Status status; + if ((status = fo.layout(blockArea)).isIncomplete()) { + this.marker = i; + // this block was modified by + // Hani Elabed 11/27/2000 + //if ((i != 0) && (status.getCode() == Status.AREA_FULL_NONE)) + //{ + // status = new Status(Status.AREA_FULL_SOME); + //} + + // new block to replace the one above + // Hani Elabed 11/27/2000 + if (status.getCode() == Status.AREA_FULL_NONE) { + // something has already been laid out + if ((i != 0)) { + status = new Status(Status.AREA_FULL_SOME); + area.addChild(blockArea); + area.setMaxHeight(area.getMaxHeight() - spaceLeft + blockArea.getMaxHeight()); + area.increaseHeight(blockArea.getHeight()); + area.setAbsoluteHeight( + blockArea.getAbsoluteHeight()); + anythingLaidOut = true; + + return status; + } else // i == 0 nothing was laid out.. + { + anythingLaidOut = false; + return status; + } + } + + //blockArea.end(); + area.addChild(blockArea); + area.setMaxHeight(area.getMaxHeight() - spaceLeft + blockArea.getMaxHeight()); + area.increaseHeight(blockArea.getHeight()); + area.setAbsoluteHeight(blockArea.getAbsoluteHeight()); + anythingLaidOut = true; + return status; + } + anythingLaidOut = true; + } + + blockArea.end(); + area.addChild(blockArea); + + /* should this be combined into above? */ + area.increaseHeight(blockArea.getHeight()); + + area.setAbsoluteHeight(blockArea.getAbsoluteHeight()); + + if (spaceAfter != 0) { + area.addDisplaySpace(spaceAfter); + } + + if (area instanceof BlockArea) { + area.start(); + } + + if (breakAfter == BreakAfter.PAGE) { + this.marker = BREAK_AFTER; + return new Status(Status.FORCE_PAGE_BREAK); + } + + if (breakAfter == BreakAfter.ODD_PAGE) { + this.marker = BREAK_AFTER; + return new Status(Status.FORCE_PAGE_BREAK_ODD); + } + + if (breakAfter == BreakAfter.EVEN_PAGE) { + this.marker = BREAK_AFTER; + return new Status(Status.FORCE_PAGE_BREAK_EVEN); + } + + if (breakAfter == BreakAfter.COLUMN) { + this.marker = BREAK_AFTER; + return new Status(Status.FORCE_COLUMN_BREAK); + } + + if (keepWithNext != 0) { + return new Status(Status.KEEP_WITH_NEXT); + } + + //MessageHandler.error(" b:OK" + marker + " "); + return new Status(Status.OK); + } + + public int getAreaHeight() { + return blockArea.getHeight(); + } + + + /** + * Return the content width of the boxes generated by this FO. + */ + public int getContentWidth() { + if (blockArea != null) + return blockArea.getContentWidth(); //getAllocationWidth()?? + else return 0; // not laid out yet + } + + public int getSpan() { + return this.span; + } } |