blob: e32891e9b4f0ce73d9e638ed33dc45f005467ea6 [file] [log] [blame]
/*
* 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.render.rtf.rtflib.rtfdoc;
/*
* This file is part of the RTF library of the FOP project, which was originally
* created by Bertrand Delacretaz <bdelacretaz@codeconsult.ch> and by other
* contributors to the jfor project (www.jfor.org), who agreed to donate jfor to
* the FOP project.
*/
import java.io.IOException;
import java.io.Writer;
import org.apache.fop.apps.FOPException;
/**
* <p>Model of a text run (a piece of text with attributes) in an RTF document.</p>
*
* <p>This work was authored by Bertrand Delacretaz (bdelacretaz@codeconsult.ch).</p>
*/
public class RtfText extends RtfElement {
// char code for non-breakable space
private static final int CHAR_NBSP = 160;
private static final int CHAR_TAB = 137;
private static final int CHAR_NEW_LINE = 141;
/* these next two variables are used to encode bold formating in the
* raw xml text. Usefull when specific words or phrases are to be bolded
* but their placement and length change. Thus the bold formatting becomes
* part of the data. The same method can be used for implementing other types
* of raw text formatting.
*/
private static final int CHAR_BOLD_START = 130;
private static final int CHAR_BOLD_END = 131;
/** members */
private String text;
private final RtfAttributes attr;
/** RtfText attributes: attribute names are RTF control word names to avoid
* additional mapping */
/** constant for bold */
public static final String ATTR_BOLD = "b";
/** constant for italic */
public static final String ATTR_ITALIC = "i";
/** constant for underline */
public static final String ATTR_UNDERLINE = "ul";
/** constant for underline */
public static final String ATTR_STRIKETHROUGH = "strike";
/** constant for font size */
public static final String ATTR_FONT_SIZE = "fs";
/** constant for font family */
public static final String ATTR_FONT_FAMILY = "f";
/** constant for font color */
public static final String ATTR_FONT_COLOR = "cf";
/** constant for background color */
public static final String ATTR_BACKGROUND_COLOR = "chcbpat"; // Added by Boris on 06/25//02
/** constant for superscript */
public static final String ATTR_SUPERSCRIPT = "super";
/** constant for subscript */
public static final String ATTR_SUBSCRIPT = "sub";
/** RtfText attributes: paragraph shading attributes */
/** Constant for the shading of the paragraph */
public static final String SHADING = "shading";
/** Constant for the document's color tableshading of the paragraph */
public static final String SHADING_FRONT_COLOR = "cfpat";
/** Constant for the 100% shading of the paragraph */
public static final int FULL_SHADING = 10000;
/** RtfText attributes: alignment attributes */
/** constant for align center */
public static final String ALIGN_CENTER = "qc";
/** constant for align left */
public static final String ALIGN_LEFT = "ql";
/** constant for align right */
public static final String ALIGN_RIGHT = "qr";
/** constant for align justified */
public static final String ALIGN_JUSTIFIED = "qj";
/** constant for align distributed */
public static final String ALIGN_DISTRIBUTED = "qd";
/** RtfText attributes: border attributes */
//added by Chris Scott
/** constant for bottom single border */
public static final String BDR_BOTTOM_SINGLE = "brdrb\\brsp40\\brdrs";
/** constant for bottom double border */
public static final String BDR_BOTTOM_DOUBLE = "brdrb\\brsp40\\brdrdb";
/** constant for bottom embossed border */
public static final String BDR_BOTTOM_EMBOSS = "brdrb\\brsp40\\brdremboss";
/** constant for bottom dotted border */
public static final String BDR_BOTTOM_DOTTED = "brdrb\\brsp40\\brdrdot";
/** constant for bottom dashed border */
public static final String BDR_BOTTOM_DASH = "brdrb\\brsp40\\brdrdash";
/** RtfText attributes: fields */
//must be carefull of group markings and star control
//ie page field:
// "{\field {\*\fldinst {PAGE}} {\fldrslt}}"
/** constant for field */
public static final String RTF_FIELD = "field";
/** constant for field page */
public static final String RTF_FIELD_PAGE = "fldinst { PAGE }";
/** constant for field result */
public static final String RTF_FIELD_RESULT = "fldrslt";
/**RtfText attributes: indentation attributes */
//added by Chris Scott
/** constant for left indent body */
public static final String LEFT_INDENT_BODY = "li";
/** constant for left indent first */
public static final String LEFT_INDENT_FIRST = "fi-";
/** constant for right indent body */
public static final String RIGHT_INDENT_BODY = "ri";
/** constant for center tab */
public static final String TAB_CENTER = "tqc\\tx";
/** constant for right tab */
public static final String TAB_RIGHT = "tqr\\tx";
/** constant for tab leader dots */
public static final String TAB_LEADER_DOTS = "tldot";
/** constant for tab leader hyphens */
public static final String TAB_LEADER_HYPHEN = "tlhyph";
/** constant for tab leader underscores */
public static final String TAB_LEADER_UNDER = "tlul";
/** constant for tab leader thick */
public static final String TAB_LEADER_THICK = "tlth";
/** constant for tab leader equals */
public static final String TAB_LEADER_EQUALS = "tleq";
/** Space before/after a paragraph */
//these lines were added by Boris Pouderous
public static final String SPACE_BEFORE = "sb";
/** Space after a paragraph */
public static final String SPACE_AFTER = "sa";
/** RtfText attributes: this must contain all allignment attributes names */
public static final String[] ALIGNMENT = new String []
{
ALIGN_CENTER, ALIGN_LEFT, ALIGN_RIGHT, ALIGN_JUSTIFIED, ALIGN_DISTRIBUTED
};
/** RtfText attributes:: this must contain all border attribute names*/
//this line added by Chris Scott, Westinghouse
public static final String[] BORDER = new String []
{
BDR_BOTTOM_SINGLE, BDR_BOTTOM_DOUBLE, BDR_BOTTOM_EMBOSS, BDR_BOTTOM_DOTTED,
BDR_BOTTOM_DASH
};
/** String array of indent constants */
public static final String[] INDENT = new String []
{
LEFT_INDENT_BODY, LEFT_INDENT_FIRST
};
/** String array of tab constants */
public static final String[] TABS = new String []
{
TAB_CENTER, TAB_RIGHT, TAB_LEADER_DOTS, TAB_LEADER_HYPHEN, TAB_LEADER_UNDER,
TAB_LEADER_THICK, TAB_LEADER_EQUALS
};
/** RtfText attributes: this must contain all attribute names */
public static final String [] ATTR_NAMES = {
ATTR_BOLD,
ATTR_ITALIC,
ATTR_UNDERLINE,
ATTR_FONT_SIZE,
ATTR_FONT_FAMILY,
ATTR_FONT_COLOR,
ATTR_BACKGROUND_COLOR
};
/** Create an RtfText in given IRtfTextContainer.
* @param str optional initial text content
*/
RtfText(IRtfTextContainer parent, Writer w, String str, RtfAttributes attr)
throws IOException {
super((RtfContainer)parent, w);
this.text = str;
this.attr = attr;
}
/**
* Write our text to the RTF stream
* @throws IOException for I/O problems
*/
public void writeRtfContent() throws IOException {
writeChars: {
//these lines were added by Boris Pouderous
if (attr != null) {
writeAttributes(attr, new String[] {RtfText.SPACE_BEFORE});
writeAttributes(attr, new String[] {RtfText.SPACE_AFTER});
}
if (isTab()) {
writeControlWord("tab");
} else if (isNewLine()) {
break writeChars;
} else if (isBold(true)) {
writeControlWord("b");
} else if (isBold(false)) {
writeControlWord("b0");
// TODO not optimal, consecutive RtfText with same attributes
// could be written without group marks
} else {
writeGroupMark(true);
if (attr != null && mustWriteAttributes()) {
writeAttributes(attr, RtfText.ATTR_NAMES);
}
RtfStringConverter.getInstance().writeRtfString(writer, text);
writeGroupMark(false);
}
}
}
/** true if our text attributes must be written */
private boolean mustWriteAttributes() {
return !isEmpty() && !isNbsp();
}
/** IRtfTextContainer requirement:
* @return a copy of our attributes
* @throws FOPException if attributes cannot be cloned
*/
public RtfAttributes getTextContainerAttributes() throws FOPException {
if (attrib == null) {
return null;
}
try {
return (RtfAttributes)this.attrib.clone();
} catch (CloneNotSupportedException e) {
throw new FOPException(e);
}
}
/** direct access to our text */
String getText() {
return text;
}
/** direct access to our text */
void setText(String str) {
text = str;
}
/**
* Checks whether the text is empty.
*
* @return true If m_text is null\n
* false m_text is set
*/
public boolean isEmpty() {
return text == null || text.trim().length() == 0;
}
/**
* True if text contains a single non-breaking space (#160).
* TODO make this more general and/or merge with isEmpty? -- what happen
* with empty paragraphs, if they will be removed, than NO, else ok
*
* @return true If m_text is character 160\n
* false m_text is not a nbsp
*/
public boolean isNbsp() {
if (!isEmpty()) {
if (text.trim().length() == 1 && text.charAt(0) == CHAR_NBSP) {
return true;
}
}
return false;
}
/**
* @return true if the text is a tab character
*/
public boolean isTab() {
return (text.trim().length() == 1 && text.charAt(0) == CHAR_TAB);
}
/**
* @return true if text is a newline character
*/
public boolean isNewLine() {
return (text.trim().length() == 1 && text.charAt(0) == CHAR_NEW_LINE);
}
/**
* @param isStart set to true if processing the start of the text (??)
* @return true if text is bold
*/
public boolean isBold(boolean isStart) {
if (isStart) {
return (text.trim().length() == 1 && text.charAt(0) == CHAR_BOLD_START);
} else {
return (text.trim().length() == 1 && text.charAt(0) == CHAR_BOLD_END);
}
}
/** @return the attributes of our text */
public RtfAttributes getTextAttributes() {
return attr;
}
}