aboutsummaryrefslogtreecommitdiffstats
path: root/src/org/apache/fop/layout/LineArea.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/apache/fop/layout/LineArea.java')
-rw-r--r--src/org/apache/fop/layout/LineArea.java401
1 files changed, 0 insertions, 401 deletions
diff --git a/src/org/apache/fop/layout/LineArea.java b/src/org/apache/fop/layout/LineArea.java
index ff2b4e2f9..c2993f38e 100644
--- a/src/org/apache/fop/layout/LineArea.java
+++ b/src/org/apache/fop/layout/LineArea.java
@@ -50,803 +50,402 @@
*/
package org.apache.fop.layout;
-
-
import org.apache.fop.render.Renderer;
-
-
import java.util.Vector;
-
import java.util.Enumeration;
-
-
import org.apache.fop.fo.properties.WrapOption; // for enumerated
-
// values
-
import org.apache.fop.fo.properties.WhiteSpaceTreatment; // for
-
// enumerated values
-
import org.apache.fop.fo.properties.TextAlign; // for enumerated
-
// values
-
import org.apache.fop.fo.properties.TextAlignLast; // for enumerated
-
// values
-
-
public class LineArea extends Area {
-
-
protected int lineHeight;
-
protected int halfLeading;
-
protected int nominalFontSize;
-
protected int nominalGlyphHeight;
-
-
protected int allocationHeight;
-
protected int startIndent;
-
protected int endIndent;
-
-
private int placementOffset;
-
-
private FontState currentFontState; // not the nominal, which is
-
// in this.fontState
-
private float red, green, blue;
-
private int wrapOption;
-
private int whiteSpaceTreatment;
-
-
/* the width of text that has definitely made it into the line
-
area */
-
protected int finalWidth = 0;
-
-
/* the width of the current word so far */
-
protected int wordWidth = 0;
-
-
/* values that prev (below) may take */
-
protected static final int NOTHING = 0;
-
protected static final int WHITESPACE = 1;
-
protected static final int TEXT = 2;
-
-
/* the character type of the previous character */
-
protected int prev = NOTHING;
-
-
/* the position in data[] of the start of the current word */
-
protected int wordStart;
-
-
/* the length (in characters) of the current word */
-
protected int wordLength = 0;
-
-
/* width of spaces before current word */
-
protected int spaceWidth = 0;
-
-
/* the inline areas that have not yet been added to the line
-
because subsequent characters to come (in a different addText)
-
may be part of the same word */
-
protected Vector pendingAreas = new Vector();
-
-
/* the width of the pendingAreas */
-
protected int pendingWidth = 0;
-
-
public LineArea(FontState fontState, int lineHeight, int
-
halfLeading, int allocationWidth, int startIndent,
-
int endIndent) {
-
super(fontState);
-
-
this.currentFontState = fontState;
-
this.lineHeight = lineHeight;
-
this.nominalFontSize = fontState.getFontSize();
-
this.nominalGlyphHeight = fontState.getAscender() -
-
fontState.getDescender();
-
-
this.placementOffset = fontState.getAscender();
-
this.contentRectangleWidth = allocationWidth - startIndent -
-
endIndent;
-
this.fontState = fontState;
-
-
this.allocationHeight = this.nominalGlyphHeight;
-
this.halfLeading = this.lineHeight - this.allocationHeight;
-
-
this.startIndent = startIndent;
-
this.endIndent = endIndent;
-
-
}
-
-
public void render(Renderer renderer) {
-
renderer.renderLineArea(this);
-
}
-
-
public int addText(char data[], int start, int end) {
-
boolean overrun = false;
-
-
wordStart = start;
-
wordLength = 0;
-
wordWidth = 0;
-
-
/* iterate over each character */
-
for (int i = start; i < end; i++) {
-
int charWidth;
-
/* get the character */
-
char c = data[i];
-
-
if (c > 127) {
-
/* this class shouldn't be hard coded */
-
char d =
-
org.apache.fop.render.pdf.CodePointMapping.map[c];
-
if (d != 0) {
-
c = data[i] = d;
-
} else {
-
System.err.print("ch"
-
+ (int)c + "?");
-
c = data[i] = '#';
-
}
-
}
-
-
charWidth = currentFontState.width(c);
-
-
if ((c == ' ') ||
-
(c == '\n') ||
-
(c == '\r') ||
-
(c == '\t')) { // whitespace
-
-
if (prev == WHITESPACE) {
-
-
// if current & previous are WHITESPACE
-
-
if (this.whiteSpaceTreatment ==
-
WhiteSpaceTreatment.PRESERVE) {
-
if (c == ' ') {
-
spaceWidth += currentFontState.width(32);
-
} else if (c == '\n') {
-
// force line break
-
return i;
-
} else if (c == '\t') {
-
spaceWidth += 8 * currentFontState.width(32);
-
}
-
} // else ignore it
-
-
} else if (prev == TEXT) {
-
-
// if current is WHITESPACE and previous TEXT
-
-
// the current word made it, so
-
-
// add the space before the current word (if there
-
// was some)
-
-
if (spaceWidth > 0) {
-
addChild(new InlineSpace(spaceWidth));
-
finalWidth += spaceWidth;
-
spaceWidth = 0;
-
}
-
-
// add any pending areas
-
-
Enumeration e = pendingAreas.elements();
-
while (e.hasMoreElements()) {
-
InlineArea inlineArea = (InlineArea) e.nextElement();
-
addChild(inlineArea);
-
}
-
finalWidth += pendingWidth;
-
-
// reset pending areas array
-
pendingWidth = 0;
-
pendingAreas = new Vector();
-
-
// add the current word
-
-
if (wordLength > 0) {
-
addChild(new InlineArea(currentFontState,
-
this.red, this.green,
-
this.blue, new
-
String(data, wordStart,
-
wordLength),
-
wordWidth));
-
finalWidth += wordWidth;
-
-
// reset word width
-
wordWidth = 0;
-
}
-
-
// deal with this new whitespace following the
-
// word we just added
-
-
prev = WHITESPACE;
-
-
if (this.whiteSpaceTreatment ==
-
WhiteSpaceTreatment.IGNORE) {
-
// do nothing
-
} else {
-
spaceWidth = currentFontState.width(32);
-
}
-
if (this.whiteSpaceTreatment ==
-
WhiteSpaceTreatment.PRESERVE) {
-
if (c == '\n') {
-
// force a line break
-
return i;
-
} else if (c == '\t') {
-
spaceWidth = currentFontState.width(32);
-
}
-
}
-
-
} else {
-
-
// if current is WHITESPACE and no previous
-
-
if (this.whiteSpaceTreatment ==
-
WhiteSpaceTreatment.PRESERVE) {
-
prev = WHITESPACE;
-
spaceWidth = currentFontState.width(32);
-
} else {
-
// skip over it
-
start++;
-
}
-
}
-
-
} else { // current is TEXT
-
-
if (prev == WHITESPACE) {
-
-
// if current is TEXT and previous WHITESPACE
-
-
wordWidth = charWidth;
-
if ((finalWidth + spaceWidth + wordWidth) >
-
this.contentRectangleWidth) {
-
if (overrun)
-
System.err.print(">");
-
if (this.wrapOption == WrapOption.WRAP)
-
return i;
-
}
-
prev = TEXT;
-
wordStart = i;
-
wordLength = 1;
-
} else if (prev == TEXT) {
-
wordLength++;
-
wordWidth += charWidth;
-
} else { // nothing previous
-
prev = TEXT;
-
wordStart = i;
-
wordLength = 1;
-
wordWidth = charWidth;
-
}
-
-
if ((finalWidth + spaceWidth + pendingWidth + wordWidth) >
-
this.contentRectangleWidth) {
-
-
// BREAK MID WORD
-
if (wordStart == start) { // if couldn't even fit
-
// first word
-
overrun = true;
-
// if not at start of line, return word start
-
// to try again on a new line
-
if (finalWidth > 0) {
-
return wordStart;
-
}
-
} else if (this.wrapOption == WrapOption.WRAP) {
-
return wordStart;
-
}
-
}
-
-
}
-
} // end of iteration over text
-
-
if (prev == TEXT) {
-
pendingAreas.addElement(new InlineArea(currentFontState, this.red,
-
this.green, this.blue, new
-
String(data, wordStart,
-
wordLength), wordWidth));
-
pendingWidth += wordWidth;
-
wordWidth = 0;
-
}
-
-
if (overrun)
-
System.err.print(">");
-
return -1;
-
}
-
-
public void addPending() {
-
if (spaceWidth > 0) {
-
addChild(new InlineSpace(spaceWidth));
-
finalWidth += spaceWidth;
-
spaceWidth = 0;
-
}
-
-
Enumeration e = pendingAreas.elements();
-
while (e.hasMoreElements()) {
-
InlineArea inlineArea = (InlineArea) e.nextElement();
-
addChild(inlineArea);
-
}
-
finalWidth += pendingWidth;
-
-
// reset pending areas array
-
pendingWidth = 0;
-
pendingAreas = new Vector();
-
}
-
-
public void align(int type) {
-
int padding;
-
-
switch (type) {
-
case TextAlign.START: // left
-
padding = this.contentRectangleWidth - finalWidth;
-
endIndent += padding;
-
break;
-
case TextAlign.END: // right
-
padding = this.contentRectangleWidth - finalWidth;
-
startIndent += padding;
-
break;
-
case TextAlign.CENTERED: // center
-
padding = (this.contentRectangleWidth - finalWidth)/2;
-
startIndent += padding;
-
endIndent += padding;
-
break;
-
case TextAlign.JUSTIFIED: // justify
-
Vector spaceList = new Vector();
-
-
int spaceCount = 0;
-
Enumeration e = children.elements();
-
while (e.hasMoreElements()) {
-
Box b = (Box)e.nextElement();
-
if (b instanceof InlineSpace) {
-
InlineSpace space = (InlineSpace)b;
-
spaceList.addElement(space);
-
spaceCount++;
-
}
-
}
-
if (spaceCount > 0) {
-
padding = (this.contentRectangleWidth - finalWidth) /
-
spaceCount;
-
} else { // no spaces
-
padding = 0;
-
}
-
Enumeration f = spaceList.elements();
-
while (f.hasMoreElements()) {
-
InlineSpace space2 = (InlineSpace)f.nextElement();
-
int i = space2.getSize();
-
space2.setSize(i + padding);
-
}
-
}
-
}
-
-
public void changeColor(float red, float green, float blue) {
-
this.red = red;
-
this.green = green;
-
this.blue = blue;
-
}
-
-
public void changeFont(FontState fontState) {
-
this.currentFontState = fontState;
-
}
-
-
public void changeWhiteSpaceTreatment(int whiteSpaceTreatment) {
-
this.whiteSpaceTreatment = whiteSpaceTreatment;
-
}
-
-
public void changeWrapOption(int wrapOption) {
-
this.wrapOption = wrapOption;
-
}
-
-
public int getEndIndent() {
-
return endIndent;
-
}
-
-
public int getHeight() {
-
return this.allocationHeight;
-
}
-
-
public int getPlacementOffset() {
-
return this.placementOffset;
-
}
-
-
public int getStartIndent() {
-
return startIndent;
-
}
-
-
public boolean isEmpty() {
-
return (prev==0);
-
}
-
-
public Vector getPendingAreas() {
-
return pendingAreas;
-
}
-
-
public int getPendingWidth() {
-
return pendingWidth;
-
}
-
-
public void setPendingAreas(Vector areas) {
-
pendingAreas = areas;
-
}
-
-
public void setPendingWidth(int width) {
-
pendingWidth = width;
-
}
-
}
-