/* * 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; } }