All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.fop.render.rtf.rtflib.rtfdoc.RtfContainer Maven / Gradle / Ivy

There is a newer version: 1.2.2.1-jre17
Show newest version
/*
 * 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: RtfContainer.java 1805173 2017-08-16 10:50:04Z ssteiner $ */

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 [email protected] 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 java.util.LinkedList;
import java.util.List;

import org.apache.fop.render.rtf.rtflib.exceptions.RtfStructureException;

/**
 * 

An RtfElement that can contain other elements.

* *

This work was authored by Bertrand Delacretaz ([email protected]).

*/ public class RtfContainer extends RtfElement { private LinkedList children; // 'final' removed by Boris Poudérous on 07/22/2002 private RtfOptions options = new RtfOptions(); private RtfElement lastChild; /** Create an RTF container as a child of given container */ RtfContainer(RtfContainer parent, Writer w) throws IOException { this(parent, w, null); } /** Create an RTF container as a child of given container with given attributes */ RtfContainer(RtfContainer parent, Writer w, RtfAttributes attr) throws IOException { super(parent, w, attr); children = new LinkedList(); } /** * set options * @param opt options to set */ public void setOptions(RtfOptions opt) { options = opt; } /** * add a child element to this * @param e child element to add * @throws RtfStructureException for trying to add an invalid child (??) */ protected void addChild(RtfElement e) throws RtfStructureException { if (isClosed()) { // No childs should be added to a container that has been closed final StringBuffer sb = new StringBuffer(); sb.append("addChild: container already closed (parent="); sb.append(this.getClass().getName()); sb.append(" child="); sb.append(e.getClass().getName()); sb.append(")"); final String msg = sb.toString(); // warn of this problem final RtfFile rf = getRtfFile(); // if(rf.getLog() != null) { // rf.getLog().logWarning(msg); // } // TODO this should be activated to help detect XSL-FO constructs // that we do not handle properly. /* throw new RtfStructureException(msg); */ } children.add(e); lastChild = e; } /** * @return a copy of our children's list */ public List getChildren() { return (List)children.clone(); } /** * @return the number of children */ public int getChildCount() { return children.size(); } private int findChildren(RtfElement aChild, int iStart) { for (Object o : this.getChildren()) { final RtfElement e = (RtfElement) o; if (aChild == e) { return iStart; } else if (e instanceof RtfContainer) { int iFound = ((RtfContainer) e).findChildren(aChild, (iStart + 1)); if (iFound != -1) { return iFound; } } } return -1; } /** * Find the passed child in the current container * @param aChild the child element * @return the depth (nested level) inside the current container */ public int findChildren(RtfElement aChild) { return findChildren(aChild, 0); } /** * Add by Boris Poudérous on 07/22/2002 * Set the children list * @param list list of child objects * @return true if process succeeded */ public boolean setChildren(List list) { if (list instanceof LinkedList) { this.children = (LinkedList) list; return true; } return false; } /** * write RTF code of all our children * @throws IOException for I/O problems */ protected void writeRtfContent() throws IOException { for (Object aChildren : children) { final RtfElement e = (RtfElement) aChildren; e.writeRtf(); } } /** return our options */ RtfOptions getOptions() { return options; } /** true if this (recursively) contains at least one RtfText object */ boolean containsText() { boolean result = false; for (Object aChildren : children) { final RtfElement e = (RtfElement) aChildren; if (e instanceof RtfText) { result = !e.isEmpty(); } else if (e instanceof RtfContainer) { if (((RtfContainer) e).containsText()) { result = true; } } if (result) { break; } } return result; } /** debugging to given Writer */ void dump(Writer w, int indent) throws IOException { super.dump(w, indent); for (Object aChildren : children) { final RtfElement e = (RtfElement) aChildren; e.dump(w, indent + 1); } } /** * minimal debugging display * @return String representation of object contents */ public String toString() { return super.toString() + " (" + getChildCount() + " children)"; } /** * @return false if empty or if our options block writing */ protected boolean okToWriteRtf() { boolean result = super.okToWriteRtf() && !isEmpty(); if (result && !options.renderContainer(this)) { result = false; } return result; } /** * @return true if this element would generate no "useful" RTF content, * i.e. (for RtfContainer) true if it has no children where isEmpty() is false */ public boolean isEmpty() { boolean result = true; for (Object aChildren : children) { final RtfElement e = (RtfElement) aChildren; if (!e.isEmpty()) { result = false; break; } } return result; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy