+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.apps;
-/*
- * originally contributed by
- * Juergen Verwohlt: Juergen.Verwohlt@jCatalog.com,
- * Rainer Steinkuhle: Rainer.Steinkuhle@jCatalog.com,
- * Stanislav Gorkhover: Stanislav.Gorkhover@jCatalog.com
- * Modified to use streaming API by Mark Lillywhite, mark-fop@inomial.com
- */
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.viewer.*;
-import org.apache.fop.render.awt.*;
-
-
-import javax.swing.UIManager;
-import java.awt.*;
-
-// SAX
-import org.xml.sax.XMLReader;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-
-
-// Java
-import java.io.FileReader;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.PrintWriter;
-import java.io.IOException;
-import java.io.FileNotFoundException;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.*;
-
-
-
-/**
- * initialize AWT previewer
- */
-
-public class AWTStarter extends CommandLineStarter {
-
- PreviewDialog frame;
- AWTRenderer renderer;
- public static String TRANSLATION_PATH =
- "/org/apache/fop/viewer/resources/";
-
- private Translator resource;
-
- public AWTStarter(CommandLineOptions commandLineOptions)
- throws FOPException {
- super(commandLineOptions);
- init();
- }
-
- private void init() {
- try {
- UIManager.setLookAndFeel(new javax.swing.plaf.metal.MetalLookAndFeel());
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- String language = commandLineOptions.getLanguage();
-
- if (language == null)
- language = System.getProperty("user.language");
-
- resource = getResourceBundle(TRANSLATION_PATH + "resources."
- + language);
-
- UserMessage.setTranslator(getResourceBundle(TRANSLATION_PATH
- + "messages."
- + language));
-
- resource.setMissingEmphasized(false);
- renderer = new AWTRenderer(resource);
- frame = createPreviewDialog(renderer, resource);
- renderer.setProgressListener(frame);
- renderer.setComponent(frame);
- MessageHandler.setOutputMethod(MessageHandler.EVENT);
- MessageHandler.addListener(frame);
- }
-
-
- public void run() throws FOPException {
- Driver driver = new Driver();
- if (errorDump) {
- driver.setErrorDump(true);
- }
-
- // init parser
- frame.progress(resource.getString("Init parser") + " ...");
- XMLReader parser = inputHandler.getParser();
-
- if (parser == null) {
- throw new FOPException("Unable to create SAX parser");
- }
-
- setParserFeatures(parser);
-
- try {
- driver.setRenderer(renderer);
-
- // build FO tree: time
- frame.progress(resource.getString("Build FO tree") + " ...");
- driver.render(parser, inputHandler.getInputSource());
-
- frame.progress(resource.getString("Show"));
- frame.showPage();
-
- } catch (Exception e) {
- if (e instanceof FOPException) {
- throw (FOPException)e;
- }
- throw new FOPException(e);
- }
-
- }
-
- protected PreviewDialog createPreviewDialog(AWTRenderer renderer,
- Translator res) {
- PreviewDialog frame = new PreviewDialog(renderer, res);
- frame.validate();
-
- // center window
- Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
- Dimension frameSize = frame.getSize();
- if (frameSize.height > screenSize.height)
- frameSize.height = screenSize.height;
- if (frameSize.width > screenSize.width)
- frameSize.width = screenSize.width;
- frame.setLocation((screenSize.width - frameSize.width) / 2,
- (screenSize.height - frameSize.height) / 2);
- frame.setVisible(true);
- return frame;
- }
-
-
-
- private SecureResourceBundle getResourceBundle(String path) {
- InputStream in = null;
-
- try {
- URL url = getClass().getResource(path);
- in = url.openStream();
- } catch (Exception ex) {
- MessageHandler.logln("Can't find URL to: <" + path + "> "
- + ex.getMessage());
- }
- return new SecureResourceBundle(in);
- }
-
-}
-
-
-
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.apps;
-
-// java
-import java.util.Vector;
-import java.io.File;
-import java.io.FileNotFoundException;
-
-// FOP
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.configuration.Configuration;
-import org.apache.fop.apps.FOPException;
-
-/**
- * Options parses the commandline arguments
- */
-public class CommandLineOptions {
-
- /* input / output not set */
- private static final int NOT_SET = 0;
- /* input: fo file */
- private static final int FO_INPUT = 1;
- /* input: xml+xsl file */
- private static final int XSLT_INPUT = 2;
- /* output: pdf file */
- private static final int PDF_OUTPUT = 1;
- /* output: screen using swing */
- private static final int AWT_OUTPUT = 2;
- /* output: mif file */
- private static final int MIF_OUTPUT = 3;
- /* output: sent swing rendered file to printer */
- private static final int PRINT_OUTPUT = 4;
- /* output: pcl file */
- private static final int PCL_OUTPUT = 5;
- /* output: postscript file */
- private static final int PS_OUTPUT = 6;
- /* output: text file */
- private static final int TXT_OUTPUT = 7;
-
- /* System buffers */
- private static final int BUFFER_FILE = 8;
-
- /* System buffers */
- private static final int AREA_OUTPUT = 9;
-
- /* use debug mode */
- Boolean errorDump = new Boolean(false);
- /* show configuration information */
- Boolean dumpConfiguration = new Boolean(false);
- /* suppress any progress information */
- Boolean quiet = new Boolean(false);
- /* for area tree XML output, only down to block area level */
- Boolean suppressLowLevelAreas = new Boolean(false);
- /* name of user configuration file */
- File userConfigFile = null;
- /* name of input fo file */
- File fofile = null;
- /* name of xsltfile (xslt transformation as input) */
- File xsltfile = null;
- /* name of xml file (xslt transformation as input) */
- File xmlfile = null;
- /* name of output file */
- File outfile = null;
- /* name of buffer file */
- File bufferFile = null;
- /* input mode */
- int inputmode = NOT_SET;
- /* output mode */
- int outputmode = NOT_SET;
- /* buffer mode */
- int buffermode = NOT_SET;
- /* language for user information */
- String language = null;
-
- private java.util.Hashtable rendererOptions;
-
- public CommandLineOptions(String[] args)
- throws FOPException, FileNotFoundException {
- boolean optionsParsed = true;
- rendererOptions = new java.util.Hashtable();
- try {
- optionsParsed = parseOptions(args);
- if (optionsParsed) {
- checkSettings();
- if (errorDump != null && errorDump.booleanValue()) {
- debug();
- }
- }
- } catch (FOPException e) {
- printUsage();
- throw e;
- } catch (java.io.FileNotFoundException e) {
- printUsage();
- throw e;
- }
-
- }
-
- /**
- * parses the commandline arguments
- * @return true if parse was successful and procesing can continue, false if processing should stop
- * @exception FOPException if there was an error in the format of the options
- */
- private boolean parseOptions(String args[]) throws FOPException {
- for (int i = 0; i < args.length; i++) {
- if (args[i].equals("-d") || args[i].equals("--full-error-dump")) {
- errorDump = new Boolean(true);
- } else if (args[i].equals("-x")
- || args[i].equals("--dump-config")) {
- dumpConfiguration = new Boolean(true);
- } else if (args[i].equals("-q") || args[i].equals("--quiet")) {
- quiet = new Boolean(true);
- } else if (args[i].equals("-c")) {
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("if you use '-c', you must specify the name of the configuration file");
- } else {
- userConfigFile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].equals("-l")) {
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("if you use '-l', you must specify a language");
- } else {
- language = args[i + 1];
- i++;
- }
- } else if (args[i].equals("-s")) {
- suppressLowLevelAreas = new Boolean(true);
- } else if (args[i].equals("-fo")) {
- inputmode = FO_INPUT;
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the fo file for the '-fo' option");
- } else {
- fofile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].equals("-xsl")) {
- inputmode = XSLT_INPUT;
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the stylesheet file for the '-xsl' option");
- } else {
- xsltfile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].equals("-xml")) {
- inputmode = XSLT_INPUT;
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the input file for the '-xml' option");
- } else {
- xmlfile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].equals("-awt")) {
- setOutputMode(AWT_OUTPUT);
- } else if (args[i].equals("-pdf")) {
- setOutputMode(PDF_OUTPUT);
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the pdf output file");
- } else {
- outfile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].equals("-mif")) {
- setOutputMode(MIF_OUTPUT);
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the mif output file");
- } else {
- outfile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].equals("-print")) {
- setOutputMode(PRINT_OUTPUT);
- // show print help
- if (i + 1 < args.length) {
- if (args[i + 1].equals("help")) {
- printUsagePrintOutput();
- return false;
- }
- }
- } else if (args[i].equals("-pcl")) {
- setOutputMode(PCL_OUTPUT);
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the pdf output file");
- } else {
- outfile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].equals("-ps")) {
- setOutputMode(PS_OUTPUT);
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the PostScript output file");
- } else {
- outfile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].equals("-txt")) {
- setOutputMode(TXT_OUTPUT);
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the text output file");
- } else {
- outfile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].charAt(0) != '-') {
- if (inputmode == NOT_SET) {
- inputmode = FO_INPUT;
- fofile = new File(args[i]);
- } else if (outputmode == NOT_SET) {
- outputmode = PDF_OUTPUT;
- outfile = new File(args[i]);
- } else {
- throw new FOPException("Don't know what to do with "
- + args[i]);
- }
- } else if (args[i].equals("-buf")) {
- if (buffermode == NOT_SET) {
- buffermode = BUFFER_FILE;
- } else {
- MessageHandler.errorln("ERROR: you can only set one buffer method");
- printUsage();
- }
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- MessageHandler.errorln("ERROR: you must specify the buffer output file");
- printUsage();
- } else {
- bufferFile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].equals("-at")) {
- setOutputMode(AREA_OUTPUT);
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the area-tree output file");
- } else {
- outfile = new File(args[i + 1]);
- i++;
- }
- } else {
- printUsage();
- return false;
- }
- }
- return true;
- } // end parseOptions
-
- private void setOutputMode(int mode) throws FOPException {
- if (outputmode == NOT_SET) {
- outputmode = mode;
- } else {
- throw new FOPException("you can only set one output method");
- }
- }
-
- /**
- * checks whether all necessary information has been given in a consistent way
- */
- private void checkSettings() throws FOPException, FileNotFoundException {
- if (inputmode == NOT_SET) {
- throw new FOPException("No input file specified");
- }
-
- if (outputmode == NOT_SET) {
- throw new FOPException("No output file specified");
- }
-
- if (inputmode == XSLT_INPUT) {
- // check whether xml *and* xslt file have been set
- if (xmlfile == null) {
- throw new FOPException("XML file must be specified for the tranform mode");
- }
- if (xsltfile == null) {
- throw new FOPException("XSLT file must be specified for the tranform mode");
- }
-
- // warning if fofile has been set in xslt mode
- if (fofile != null) {
- MessageHandler.errorln("WARNING: Can't use fo file with transform mode! Ignoring.\n"
- + "Your input is " + "\n xmlfile: "
- + xmlfile.getAbsolutePath()
- + "\nxsltfile: "
- + xsltfile.getAbsolutePath()
- + "\n fofile: "
- + fofile.getAbsolutePath());
- }
- if (!xmlfile.exists()) {
- throw new FileNotFoundException("xml file "
- + xmlfile.getAbsolutePath()
- + " not found ");
- }
- if (!xsltfile.exists()) {
- throw new FileNotFoundException("xsl file "
- + xsltfile.getAbsolutePath()
- + " not found ");
- }
-
- } else if (inputmode == FO_INPUT) {
- if (xmlfile != null || xsltfile != null) {
- MessageHandler.errorln("WARNING: fo input mode, but xmlfile or xslt file are set:");
- MessageHandler.errorln("xml file: " + xmlfile.toString());
- MessageHandler.errorln("xslt file: " + xsltfile.toString());
- }
- if (!fofile.exists()) {
- throw new FileNotFoundException("fo file "
- + fofile.getAbsolutePath()
- + " not found ");
- }
-
- }
- } // end checkSettings
-
- /**
- * returns the chosen renderer, throws FOPException
- */
- public int getRenderer() throws FOPException {
- switch (outputmode) {
- case NOT_SET:
- throw new FOPException("Renderer has not been set!");
- case PDF_OUTPUT:
- return Driver.RENDER_PDF;
- case AWT_OUTPUT:
- return Driver.RENDER_AWT;
- case MIF_OUTPUT:
- return Driver.RENDER_MIF;
- case PRINT_OUTPUT:
- return Driver.RENDER_PRINT;
- case PCL_OUTPUT:
- return Driver.RENDER_PCL;
- case PS_OUTPUT:
- return Driver.RENDER_PS;
- case TXT_OUTPUT:
- return Driver.RENDER_TXT;
- case AREA_OUTPUT:
- rendererOptions.put("fineDetail", isCoarseAreaXml());
- return Driver.RENDER_XML;
- default:
- throw new FOPException("Invalid Renderer setting!");
- }
- }
-
- /**
- *
- */
- public InputHandler getInputHandler() {
- switch (inputmode) {
- case FO_INPUT:
- return new FOInputHandler(fofile);
- case XSLT_INPUT:
- return new XSLTInputHandler(xmlfile, xsltfile);
- default:
- return new FOInputHandler(fofile);
- }
- }
-
- public java.util.Hashtable getRendererOptions() {
- return rendererOptions;
- }
-
- public Starter getStarter() throws FOPException {
- switch (outputmode) {
- case AWT_OUTPUT:
- try {
- return ((Starter)Class.forName("org.apache.fop.apps.AWTStarter").getConstructor(new Class[] {
- CommandLineOptions.class
- }).newInstance(new Object[] {
- this
- }));
- } catch (Exception e) {
- if (e instanceof FOPException) {
- throw (FOPException)e;
- }
- throw new FOPException("AWTStarter could not be loaded.", e);
- }
- case PRINT_OUTPUT:
- try {
- return ((Starter)Class.forName("org.apache.fop.apps.PrintStarter").getConstructor(new Class[] {
- CommandLineOptions.class
- }).newInstance(new Object[] {
- this
- }));
- } catch (Exception e) {
- if (e instanceof FOPException) {
- throw (FOPException)e;
- }
- throw new FOPException("PrintStarter could not be loaded.",
- e);
- }
-
- default:
- return new CommandLineStarter(this);
- }
- }
-
- public int getInputMode() {
- return inputmode;
- }
-
- public int getOutputMode() {
- return outputmode;
- }
-
- public File getFOFile() {
- return fofile;
- }
-
- public File getXMLFile() {
- return xmlfile;
- }
-
- public File getXSLFile() {
- return xsltfile;
- }
-
- public File getOutputFile() {
- return outfile;
- }
-
- public File getUserConfigFile() {
- return userConfigFile;
- }
-
- public String getLanguage() {
- return language;
- }
-
- public File getBufferFile() {
- return bufferFile;
- }
-
- public Boolean isQuiet() {
- return quiet;
- }
-
- public Boolean dumpConfiguration() {
- return dumpConfiguration;
- }
-
- public Boolean isDebugMode() {
- return errorDump;
- }
-
- public Boolean isCoarseAreaXml() {
- return suppressLowLevelAreas;
- }
-
- /**
- * return either the fofile or the xmlfile
- */
- public File getInputFile() {
- switch (inputmode) {
- case FO_INPUT:
- return fofile;
- case XSLT_INPUT:
- return xmlfile;
- default:
- return fofile;
- }
- }
-
- /**
- * shows the commandline syntax including a summary of all available options and some examples
- */
- public static void printUsage() {
- MessageHandler.errorln("\nUSAGE\nFop [options] [-fo|-xml] infile [-xsl file] [-awt|-pdf|-mif|-pcl|-ps|-txt|-at|-print] <outfile>\n"
- + " [OPTIONS] \n"
- + " -d debug mode \n"
- + " -x dump configuration settings \n"
- + " -q quiet mode \n"
- + " -c cfg.xml use additional configuration file cfg.xml\n"
- + " -l lang the language to use for user information \n"
- + " -s for area tree XML, down to block areas only\n\n"
- + " [INPUT] \n"
- + " infile xsl:fo input file (the same as the next) \n"
- + " -fo infile xsl:fo input file \n"
- + " -xml infile xml input file, must be used together with -xsl \n"
- + " -xsl stylesheet xslt stylesheet \n \n"
- + " [OUTPUT] \n"
- + " outfile input will be rendered as pdf file into outfile \n"
- + " -pdf outfile input will be rendered as pdf file (outfile req'd) \n"
- + " -awt input will be displayed on screen \n"
- + " -mif outfile input will be rendered as mif file (outfile req'd)\n"
- + " -pcl outfile input will be rendered as pcl file (outfile req'd) \n"
- + " -ps outfile input will be rendered as PostScript file (outfile req'd) \n"
- + " -txt outfile input will be rendered as text file (outfile req'd) \n"
- + " -at outfile representation of area tree as XML (outfile req'd) \n"
- + " -print input file will be rendered and sent to the printer \n"
- + " see options with \"-print help\" \n\n"
- + " [Examples]\n" + " Fop foo.fo foo.pdf \n"
- + " Fop -fo foo.fo -pdf foo.pdf (does the same as the previous line)\n"
- + " Fop -xsl foo.xsl -xml foo.xml -pdf foo.pdf\n"
- + " Fop foo.fo -mif foo.mif\n"
- + " Fop foo.fo -print or Fop -print foo.fo \n"
- + " Fop foo.fo -awt \n");
- }
-
- /**
- * shows the options for print output
- */
- public void printUsagePrintOutput() {
- MessageHandler.errorln("USAGE: -print [-Dstart=i] [-Dend=i] [-Dcopies=i] [-Deven=true|false] "
- + " org.apache.fop.apps.Fop (..) -print \n"
- + "Example:\n"
- + "java -Dstart=1 -Dend=2 org.apache.Fop.apps.Fop infile.fo -print ");
- }
-
-
- /**
- * debug mode. outputs all commandline settings
- */
- private void debug() {
- System.out.print("Input mode: ");
- switch (inputmode) {
- case NOT_SET:
- MessageHandler.logln("not set");
- break;
- case FO_INPUT:
- MessageHandler.logln("FO ");
- MessageHandler.logln("fo input file: " + fofile.toString());
- break;
- case XSLT_INPUT:
- MessageHandler.logln("xslt transformation");
- MessageHandler.logln("xml input file: " + xmlfile.toString());
- MessageHandler.logln("xslt stylesheet: " + xsltfile.toString());
- break;
- default:
- MessageHandler.logln("unknown input type");
- }
- System.out.print("Output mode: ");
- switch (outputmode) {
- case NOT_SET:
- MessageHandler.logln("not set");
- break;
- case PDF_OUTPUT:
- MessageHandler.logln("pdf");
- MessageHandler.logln("output file: " + outfile.toString());
- break;
- case AWT_OUTPUT:
- MessageHandler.logln("awt on screen");
- if (outfile != null) {
- MessageHandler.logln("ERROR: awt mode, but outfile is set:");
- MessageHandler.logln("out file: " + outfile.toString());
- }
- break;
- case MIF_OUTPUT:
- MessageHandler.logln("mif");
- MessageHandler.logln("output file: " + outfile.toString());
- break;
- case PRINT_OUTPUT:
- MessageHandler.logln("print directly");
- if (outfile != null) {
- MessageHandler.logln("ERROR: print mode, but outfile is set:");
- MessageHandler.logln("out file: " + outfile.toString());
- }
- break;
- case PCL_OUTPUT:
- MessageHandler.logln("pcl");
- MessageHandler.logln("output file: " + outfile.toString());
- break;
- case PS_OUTPUT:
- MessageHandler.logln("PostScript");
- MessageHandler.logln("output file: " + outfile.toString());
- break;
- case TXT_OUTPUT:
- MessageHandler.logln("txt");
- MessageHandler.logln("output file: " + outfile.toString());
- break;
- default:
- MessageHandler.logln("unknown input type");
- }
-
-
- MessageHandler.logln("OPTIONS");
- if (userConfigFile != null) {
- MessageHandler.logln("user configuration file: "
- + userConfigFile.toString());
- } else {
- MessageHandler.logln("no user configuration file is used [default]");
- }
- if (errorDump != null) {
- MessageHandler.logln("debug mode on");
- } else {
- MessageHandler.logln("debug mode off [default]");
- }
- if (dumpConfiguration != null) {
- MessageHandler.logln("dump configuration");
- } else {
- MessageHandler.logln("don't dump configuration [default]");
- }
- if (quiet != null) {
- MessageHandler.logln("quiet mode on");
- } else {
- MessageHandler.logln("quiet mode off [default]");
- }
-
- }
-
- // debug: create class and output all settings
- public static void main(String args[]) {
- /*
- * for (int i = 0; i < args.length; i++) {
- * MessageHandler.logln(">"+args[i]+"<");
- * }
- */
- try {
- CommandLineOptions options = new CommandLineOptions(args);
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- // options.debug();
- }
-
-}
-
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.apps;
-
-import org.xml.sax.*;
-import com.jclark.xsl.sax.*;
-import java.io.*;
-
-// FOP
-import org.apache.fop.fo.XTFOTreeBuilder;
-import org.apache.fop.fo.XTElementMapping;
-import org.apache.fop.layout.AreaTree;
-import org.apache.fop.layout.FontInfo;
-import org.apache.fop.render.Renderer;
-import org.apache.fop.messaging.MessageHandler;
-
-// ////////////////////////////////////////////////////////////////////////////////////
-
-/**
- * A DocumentHandler that writes a PDF representation to an OutputStream.
- *
- * Use with James Clark's XT. Just put FOP on your class path and add
- * <xsl:output method="fop:org.apache.fop.apps.PDFOutputHandler"
- * xmlns:fop="http://www.jclark.com/xt/java"/>
- * to your stylesheet. Now XT will automatically call FOP.
- *
- */
-public class PDFOutputHandler extends XTFOTreeBuilder
- implements OutputDocumentHandler {
-
- /**
- * the area tree that is the result of formatting the FO tree
- */
- protected AreaTree areaTree;
-
- /**
- * the renderer to use to output the area tree
- */
- protected Renderer renderer;
-
- /**
- * the PrintWriter to use to output the results of the renderer
- */
- protected PrintWriter writer;
-
- /**
- * the stream to use to output the results of the renderer
- */
- protected OutputStream stream;
-
- private boolean keepOpen;
-
- // ////////////////////////////////////////////////////////////////////////////////////
-
- /**
- */
- public PDFOutputHandler() {}
-
- // ////////////////////////////////////////////////////////////////////////////////////
-
- /**
- */
- public PDFOutputHandler(OutputStream out) {
- this();
- this.stream = out;
- }
-
- // ////////////////////////////////////////////////////////////////////////////////////
-
- /**
- */
- public DocumentHandler init(Destination dest,
- AttributeList atts) throws IOException {
- this.stream = dest.getOutputStream("application/pdf", null);
- this.keepOpen = dest.keepOpen();
-
- String version = org.apache.fop.apps.Version.getVersion();
- setRenderer("org.apache.fop.render.pdf.PDFRenderer", version);
- addElementMapping("org.apache.fop.fo.StandardElementMapping");
- addElementMapping("org.apache.fop.svg.SVGElementMapping");
- return this;
- }
-
- // ////////////////////////////////////////////////////////////////////////////////////
-
- /**
- * set the class name of the Renderer to use as well as the
- * producer string for those renderers that can make use of it
- */
- public void setRenderer(String rendererClassName, String producer) {
- this.renderer = createRenderer(rendererClassName);
- this.renderer.setProducer(producer);
- }
-
- // ////////////////////////////////////////////////////////////////////////////////////
-
- /**
- * SAX passthrough, finish rendering the document
- */
- public void endDocument() throws SAXException {
- super.endDocument();
-
- try {
- doFormat();
- doRender();
- } catch (IOException io) {
- throw new SAXException(io);
- } catch (FOPException fop) {
- throw new SAXException(fop);
- }
- writer.flush();
- }
-
- // ////////////////////////////////////////////////////////////////////////////////////
-
- /**
- * format the formatting object tree into an area tree
- */
- public void doFormat() throws FOPException {
- FontInfo fontInfo = new FontInfo();
- this.renderer.setupFontInfo(fontInfo);
-
- this.areaTree = new AreaTree();
- this.areaTree.setFontInfo(fontInfo);
-
- format(areaTree);
- }
-
- // ////////////////////////////////////////////////////////////////////////////////////
-
- /**
- * render the area tree to the output form
- */
- public void doRender() throws IOException, FOPException {
- this.renderer.render(areaTree, this.stream);
- }
-
- // ////////////////////////////////////////////////////////////////////////////////////
-
- /**
- * add the given element mapping.
- *
- * an element mapping maps element names to Java classes
- */
- public void addElementMapping(XTElementMapping mapping) {
- mapping.addToBuilder(this);
- }
-
- // ////////////////////////////////////////////////////////////////////////////////////
-
- /**
- * add the element mapping with the given class name
- */
- public void addElementMapping(String mappingClassName) {
- createElementMapping(mappingClassName).addToBuilder(this);
- }
-
- // ////////////////////////////////////////////////////////////////////////////////////
-
- /**
- * protected method used by addElementMapping(String) to
- * instantiate element mapping class
- */
- protected XTElementMapping createElementMapping(String mappingClassName) {
- MessageHandler.logln("using element mapping " + mappingClassName);
-
- try {
- return (XTElementMapping)Class.forName(mappingClassName).newInstance();
- } catch (ClassNotFoundException e) {
- MessageHandler.errorln("Could not find " + mappingClassName);
- } catch (InstantiationException e) {
- MessageHandler.errorln("Could not instantiate "
- + mappingClassName);
- } catch (IllegalAccessException e) {
- MessageHandler.errorln("Could not access " + mappingClassName);
- } catch (ClassCastException e) {
- MessageHandler.errorln(mappingClassName
- + " is not an element mapping");
- }
- return null;
- }
-
- // ////////////////////////////////////////////////////////////////////////////////////
-
- /**
- * protected method used by setRenderer(String, String) to
- * instantiate the Renderer class
- */
- protected Renderer createRenderer(String rendererClassName) {
- MessageHandler.logln("using renderer " + rendererClassName);
-
- try {
- return (Renderer)Class.forName(rendererClassName).newInstance();
- } catch (ClassNotFoundException e) {
- MessageHandler.errorln("Could not find " + rendererClassName);
- } catch (InstantiationException e) {
- MessageHandler.errorln("Could not instantiate "
- + rendererClassName);
- } catch (IllegalAccessException e) {
- MessageHandler.errorln("Could not access " + rendererClassName);
- } catch (ClassCastException e) {
- MessageHandler.errorln(rendererClassName + " is not a renderer");
- }
- return null;
- }
-
-}
-
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.apps;
-
-/*
- * originally contributed by
- * Stanislav Gorkhover: stanislav.gorkhover@jcatalog.com
- * jCatalog Software AG
- *
- * Updated by Mark Lillywhite, mark-fop@inomial.com. Modified to
- * handle the print job better, added -Ddialog option, removed
- * (apparently) redundant copies code, generally cleaned up, and
- * added interfaces to the new Render API.
- */
-
-
-import org.xml.sax.XMLReader;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-import java.awt.Graphics;
-import java.awt.print.*;
-import java.io.OutputStream;
-import java.io.IOException;
-import java.util.Vector;
-
-import org.apache.fop.render.awt.AWTRenderer;
-import org.apache.fop.layout.AreaTree;
-import org.apache.fop.layout.Page;
-import org.apache.fop.messaging.MessageHandler;
-
-
-/**
- * This class prints a xsl-fo dokument without interaction.
- * At the moment java has not the possibility to configure the printer and it's
- * options without interaction (30.03.2000).
- * This class allows to print a set of pages (from-to), even/odd pages and many copies.
- * - Print from page xxx: property name - start, value int
- * - Print to page xxx: property name - end, value int
- * - Print even/odd pages: property name - even, value boolean
- * - Print xxx copies: property name - copies, value int
- *
- */
-public class PrintStarter extends CommandLineStarter {
-
- public PrintStarter(CommandLineOptions options) throws FOPException {
- super(options);
- }
-
- public void run() throws FOPException {
- Driver driver = new Driver();
- if (errorDump) {
- driver.setErrorDump(true);
- }
-
- String version = Version.getVersion();
- MessageHandler.errorln(version);
-
- XMLReader parser = inputHandler.getParser();
-
- setParserFeatures(parser);
-
- PrinterJob pj = PrinterJob.getPrinterJob();
- if(System.getProperty("dialog") != null)
- if(!pj.printDialog())
- throw new FOPException("Printing cancelled by operator");
-
- PrintRenderer renderer = new PrintRenderer(pj);
- int copies = getIntProperty("copies", 1);
- pj.setCopies(copies);
-
- //renderer.setCopies(copies);
-
- try {
- driver.setRenderer(renderer);
- driver.render(parser, inputHandler.getInputSource());
- } catch (Exception e) {
- if (e instanceof FOPException) {
- throw (FOPException)e;
- }
- throw new FOPException(e);
- }
-
- System.exit(0);
- }
- int getIntProperty(String name, int def) {
- String propValue = System.getProperty(name);
- if(propValue != null) {
- try {
- return Integer.parseInt(propValue);
- } catch (Exception e) {
- return def;
- }
- } else {
- return def;
- }
- }
-
- class PrintRenderer extends AWTRenderer {
-
- private static final int EVEN_AND_ALL = 0;
- private static final int EVEN = 1;
- private static final int ODD = 2;
-
- private int startNumber;
- private int endNumber;
- private int mode = EVEN_AND_ALL;
- private int copies = 1;
- private PrinterJob printerJob;
-
- PrintRenderer(PrinterJob printerJob) {
- super(null);
-
- this.printerJob = printerJob;
- startNumber = getIntProperty("start", 1) - 1;
- endNumber = getIntProperty("end", -1);
-
- printerJob.setPageable(this);
-
- mode = EVEN_AND_ALL;
- String str = System.getProperty("even");
- if (str != null) {
- try {
- mode = Boolean.valueOf(str).booleanValue() ? EVEN : ODD;
- } catch (Exception e) {}
-
- }
-
- }
-
-
-
- public void stopRenderer(OutputStream outputStream)
- throws IOException {
- super.stopRenderer(outputStream);
-
- if(endNumber == -1)
- endNumber = getPageCount();
-
- Vector numbers = getInvalidPageNumbers();
- for (int i = numbers.size() - 1; i > -1; i--)
- removePage(Integer.parseInt((String)numbers.elementAt(i)));
-
- try {
- printerJob.print();
- } catch (PrinterException e) {
- e.printStackTrace();
- throw new IOException(
- "Unable to print: " + e.getClass().getName() +
- ": " + e.getMessage());
- }
- }
-
- public void renderPage(Page page) {
- pageWidth = (int)((float)page.getWidth() / 1000f);
- pageHeight = (int)((float)page.getHeight() / 1000f);
- super.renderPage(page);
- }
-
-
- private Vector getInvalidPageNumbers() {
-
- Vector vec = new Vector();
- int max = getPageCount();
- boolean isValid;
- for (int i = 0; i < max; i++) {
- isValid = true;
- if (i < startNumber || i > endNumber) {
- isValid = false;
- } else if (mode != EVEN_AND_ALL) {
- if (mode == EVEN && ((i + 1) % 2 != 0))
- isValid = false;
- else if (mode == ODD && ((i + 1) % 2 != 1))
- isValid = false;
- }
-
- if (!isValid)
- vec.add(i + "");
- }
-
- return vec;
- }
-
- /* TODO: I'm totally not sure that this is necessary -Mark
- void setCopies(int val) {
- copies = val;
- Vector copie = tree.getPages();
- for (int i = 1; i < copies; i++) {
- tree.getPages().addAll(copie);
- }
-
- }
- */
- } // class PrintRenderer
-} // class PrintCommandLine
-
-
-
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.apps;
-
-// SAX
-import org.xml.sax.XMLReader;
-import org.xml.sax.SAXException;
-
-// Java
-import java.io.*;
-import java.net.URL;
-
-// FOP
-import org.apache.fop.messaging.MessageHandler;
-
-/**
- * abstract super class
- * Creates a SAX Parser (defaulting to Xerces).
- *
- */
-public abstract class Starter {
-
- Options options;
- InputHandler inputHandler;
-
- public Starter() throws FOPException {
- options = new Options();
- }
-
- public void setInputHandler(InputHandler inputHandler) {
- this.inputHandler = inputHandler;
- }
-
- abstract public void run() throws FOPException;
-
- // setting the parser features
- public void setParserFeatures(XMLReader parser) throws FOPException {
- try {
- parser.setFeature("http://xml.org/sax/features/namespace-prefixes",
- true);
- } catch (SAXException e) {
- throw new FOPException("Error in setting up parser feature namespace-prefixes\n"
- + "You need a parser which supports SAX version 2", e);
- }
- }
-
-}
+++ /dev/null
-package org.apache.fop.apps;
-
-import java.io.OutputStream;
-import java.io.IOException;
-import java.util.Vector;
-import java.util.Enumeration;
-
-import org.xml.sax.SAXException;
-
-import org.apache.fop.layout.FontInfo;
-import org.apache.fop.layout.Page;
-import org.apache.fop.render.Renderer;
-import org.apache.fop.layout.AreaTree;
-import org.apache.fop.datatypes.IDReferences;
-import org.apache.fop.extensions.ExtensionObj;
-import org.apache.fop.fo.pagination.PageSequence;
-import org.apache.fop.messaging.MessageHandler;
-
-/**
- This class acts as a bridge between the XML:FO parser
- and the formatting/rendering classes. It will queue
- PageSequences up until all the IDs required by them
- are satisfied, at which time it will render the
- pages.<P>
-
- StreamRenderer is created by Driver and called from
- FOTreeBuilder when a PageSequence is created,
- and AreaTree when a Page is formatted.<P>
-*/
-public class StreamRenderer extends Object {
- private static final boolean MEM_PROFILE_WITH_GC = false;
-
- /**
- Somewhere to get our stats from.
- */
- private Runtime runtime = Runtime.getRuntime();
-
- /**
- Keep track of the number of pages rendered.
- */
- int pageCount = 0;
-
- /**
- Keep track of heap memory allocated,
- for statistical purposes.
- */
- private long initialMemory;
-
- /**
- Keep track of time used by renderer.
- */
- private long startTime;
-
- /**
- The stream to which this rendering is to be
- written to. <B>Note</B> that some renderers
- do not render to a stream, and that this
- member can therefore be null.
- */
- private OutputStream outputStream;
-
- /**
- The renderer being used.
- */
- private Renderer renderer;
-
- /**
- The FontInfo for this renderer.
- */
- private FontInfo fontInfo = new FontInfo();
-
- /**
- The list of pages waiting to be renderered.
- */
- private Vector renderQueue = new Vector();
-
- /**
- The current set of IDReferences, passed to the
- areatrees and pages. This is used by the AreaTree
- as a single map of all IDs.
- */
- private IDReferences idReferences = new IDReferences();
-
- public StreamRenderer(OutputStream outputStream, Renderer renderer) {
- this.outputStream = outputStream;
- this.renderer = renderer;
- }
-
- public IDReferences getIDReferences() {
- return idReferences;
- }
-
- public void startRenderer()
- throws SAXException {
- pageCount = 0;
-
- if (MEM_PROFILE_WITH_GC)
- System.gc(); // This takes time but gives better results
-
- initialMemory = runtime.totalMemory() - runtime.freeMemory();
- startTime = System.currentTimeMillis();
-
- try {
- renderer.setupFontInfo(fontInfo);
- renderer.startRenderer(outputStream);
- } catch (IOException e) {
- throw new SAXException(e);
- }
- }
-
- public void stopRenderer()
- throws SAXException {
- /*
- Force the processing of any more queue elements,
- even if they are not resolved.
- */
- try {
- processQueue(true);
- renderer.stopRenderer(outputStream);
- } catch (FOPException e) {
- throw new SAXException(e);
- }
- catch (IOException e) {
- throw new SAXException(e);
- }
-
- if (MEM_PROFILE_WITH_GC)
- System.gc(); // This takes time but gives better results
-
- long memoryNow = runtime.totalMemory() - runtime.freeMemory();
- long memoryUsed = (memoryNow - initialMemory) / 1024L;
-
- MessageHandler.logln("Initial heap size: " + (initialMemory/1024L) + "Kb");
- MessageHandler.logln("Current heap size: " + (memoryNow/1024L) + "Kb");
- MessageHandler.logln("Total memory used: " + memoryUsed + "Kb");
-
- if (!MEM_PROFILE_WITH_GC) {
- MessageHandler.logln(" Memory use is indicative; no GC was performed");
- MessageHandler.logln(" These figures should not be used comparatively");
- }
-
- long timeUsed = System.currentTimeMillis() - startTime;
-
- MessageHandler.logln("Total time used: " + timeUsed + "ms");
- MessageHandler.logln("Pages rendererd: " + pageCount);
- MessageHandler.logln("Avg render time: " + (timeUsed / pageCount) + "ms/page");
- }
-
- /**
- Format the PageSequence. The PageSequence
- formats Pages and adds them to the AreaTree,
- which subsequently calls the StreamRenderer
- instance (this) again to render the page.
- At this time the page might be printed
- or it might be queued. A page might not
- be renderable immediately if the IDReferences
- are not all valid. In this case we defer
- the rendering until they are all valid.
- */
- public void render(PageSequence pageSequence)
- throws SAXException {
- AreaTree a = new AreaTree(this);
- a.setFontInfo(fontInfo);
-
- try {
- pageSequence.format(a);
- } catch (FOPException e) {
- throw new SAXException(e);
- }
- }
-
- public synchronized void queuePage(Page page)
- throws FOPException, IOException {
- /*
- Try to optimise on the common case that there are
- no pages pending and that all ID references are
- valid on the current pages. This short-cuts the
- pipeline and renders the area immediately.
- */
- if ((renderQueue.size() == 0) && idReferences.isEveryIdValid())
- renderer.render(page, outputStream);
- else
- addToRenderQueue(page);
-
- pageCount++;
- }
-
- private synchronized void addToRenderQueue(Page page)
- throws FOPException, IOException {
- RenderQueueEntry entry = new RenderQueueEntry(page);
- renderQueue.addElement(entry);
-
- /*
- The just-added entry could (possibly) resolve the
- waiting entries, so we try to process the queue
- now to see.
- */
- processQueue(false);
- }
-
- /**
- Try to process the queue from the first entry forward.
- If an entry can't be processed, then the queue can't
- move forward, so return.
- */
- private synchronized void processQueue(boolean force)
- throws FOPException, IOException {
- while (renderQueue.size() > 0) {
- RenderQueueEntry entry = (RenderQueueEntry) renderQueue.elementAt(0);
- if ((!force) && (!entry.isResolved()))
- break;
-
- renderer.render(entry.getPage(), outputStream);
-
- /* TODO
- Enumeration rootEnumeration =
- entry.getAreaTree().getExtensions().elements();
- while (rootEnumeration.hasMoreElements())
- renderTree.addExtension((ExtensionObj) rootEnumeration.nextElement());
- */
-
- renderQueue.removeElementAt(0);
- }
- }
-
- /**
- A RenderQueueEntry consists of the Page to be queued,
- plus a list of outstanding ID references that need to be
- resolved before the Page can be renderered.<P>
- */
- class RenderQueueEntry extends Object {
- /*
- The Page that has outstanding ID references.
- */
- private Page page;
-
- /*
- A list of ID references (names).
- */
- private Vector unresolvedIdReferences = new Vector();
-
- public RenderQueueEntry(Page page) {
- this.page = page;
-
- Enumeration e = idReferences.getInvalidElements();
- while (e.hasMoreElements())
- unresolvedIdReferences.addElement(e.nextElement());
- }
-
- public Page getPage() {
- return page;
- }
-
- /**
- See if the outstanding references are resolved
- in the current copy of IDReferences.
- */
- public boolean isResolved() {
- if ((unresolvedIdReferences.size() == 0) || idReferences.isEveryIdValid())
- return true;
-
- //
- // See if any of the unresolved references are still unresolved.
- //
- Enumeration e = unresolvedIdReferences.elements();
- while (e.hasMoreElements())
- if (!idReferences.doesIDExist((String) e.nextElement()))
- return false;
-
- unresolvedIdReferences.removeAllElements();
- return true;
- }
- }
-
- public Page getNextPage(Page current, boolean isWithinPageSequence,
- boolean isFirstCall) {
- Page nextPage = null;
- int pageIndex = 0;
- if (isFirstCall)
- pageIndex = renderQueue.size();
- else
- pageIndex = renderQueue.indexOf(current);
- if ((pageIndex + 1) < renderQueue.size()) {
- nextPage = (Page)renderQueue.elementAt(pageIndex + 1);
- if (isWithinPageSequence
- &&!nextPage.getPageSequence().equals(current.getPageSequence())) {
- nextPage = null;
- }
- }
- return nextPage;
- }
-
- public Page getPreviousPage(Page current, boolean isWithinPageSequence,
- boolean isFirstCall) {
- Page previousPage = null;
- int pageIndex = 0;
- if (isFirstCall)
- pageIndex = renderQueue.size();
- else
- pageIndex = renderQueue.indexOf(current);
- // System.out.println("Page index = " + pageIndex);
- if ((pageIndex - 1) >= 0) {
- previousPage = (Page)renderQueue.elementAt(pageIndex - 1);
- PageSequence currentPS = current.getPageSequence();
- // System.out.println("Current PS = '" + currentPS + "'");
- PageSequence previousPS = previousPage.getPageSequence();
- // System.out.println("Previous PS = '" + previousPS + "'");
- if (isWithinPageSequence &&!previousPS.equals(currentPS)) {
- // System.out.println("Outside page sequence");
- previousPage = null;
- }
- }
- return previousPage;
- }
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.apps;
-
-
-// Imported TraX classes
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.sax.SAXResult;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.sax.SAXTransformerFactory;
-
-
-// Imported SAX classes
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.XMLFilter;
-
-
-
-// Imported java.io classes
-import java.io.InputStream;
-import java.io.IOException;
-import java.io.File;
-
-// FOP
-import org.apache.fop.messaging.MessageHandler;
-
-/**
- * XSLTInputHandler basically takes an xmlfile and transforms it with an xsltfile
- * and the resulting xsl:fo document is input for Fop.
- */
-public class TraxInputHandler extends InputHandler {
-
- File xmlfile, xsltfile;
-
- public TraxInputHandler(File xmlfile, File xsltfile) {
- this.xmlfile = xmlfile;
- this.xsltfile = xsltfile;
- }
-
- /**
- * overwrites the method of the super class to return the xmlfile
- */
- public InputSource getInputSource() {
- return fileInputSource(xmlfile);
- }
-
- /**
- * overwrites this method of the super class and returns an XMLFilter instead of a
- * simple XMLReader which allows chaining of transformations
- *
- */
- public XMLReader getParser() throws FOPException {
- return this.getXMLFilter(xmlfile, xsltfile);
- }
-
- /**
- * Creates from the transformer an instance of an XMLFilter which
- * then can be used in a chain with the XMLReader passed to Driver. This way
- * during the conversion of the xml file + xslt stylesheet the resulting
- * data is fed into Fop. This should help to avoid memory problems
- * @param xmlfile The xmlfile containing the text data
- * @param xsltfile An xslt stylesheet
- * @return XMLFilter an XMLFilter which can be chained together with other XMLReaders or XMLFilters
- */
- public static XMLFilter getXMLFilter(File xmlfile,
- File xsltfile) throws FOPException {
- try {
- // Instantiate a TransformerFactory.
- TransformerFactory tFactory = TransformerFactory.newInstance();
- // Determine whether the TransformerFactory supports The use uf SAXSource
- // and SAXResult
- if (tFactory.getFeature(SAXSource.FEATURE)
- && tFactory.getFeature(SAXResult.FEATURE)) {
- // Cast the TransformerFactory to SAXTransformerFactory.
- SAXTransformerFactory saxTFactory =
- ((SAXTransformerFactory)tFactory);
- // Create an XMLFilter for each stylesheet.
- XMLFilter xmlfilter =
- saxTFactory.newXMLFilter(new StreamSource(xsltfile));
-
- // Create an XMLReader.
- XMLReader parser = createParser();
- if (parser == null) {
- throw new FOPException("Unable to create SAX parser");
- }
-
- // xmlFilter1 uses the XMLReader as its reader.
- xmlfilter.setParent(parser);
- return xmlfilter;
- } else {
- throw new FOPException("Your parser doesn't support the features SAXSource and SAXResult."
- + "\nMake sure you are using a xsl parser which supports TrAX");
- }
- } catch (Exception ex) {
- if (ex instanceof FOPException) {
- throw (FOPException)ex;
- }
- throw new FOPException(ex);
- }
- }
-
-}
-
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.apps;
-
-import java.lang.reflect.*;
-
-
-// Imported SAX classes
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-
-// Imported java.io classes
-import java.io.*;
-
-// FOP
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.tools.xslt.XSLTransform;
-
-/**
- * XSLTInputHandler basically takes an xmlfile and transforms it with an xsltfile
- * and the resulting xsl:fo document is input for Fop.
- */
-public class XSLTInputHandler extends InputHandler {
-
- File xmlfile, xsltfile;
- boolean useOldTransform = false;
-
- public XSLTInputHandler(File xmlfile, File xsltfile) {
- this.xmlfile = xmlfile;
- this.xsltfile = xsltfile;
- }
-
- /**
- * overwrites the method of the super class to return the xmlfile
- */
- public InputSource getInputSource() {
- if (useOldTransform) {
- try {
- java.io.Writer writer;
- java.io.Reader reader;
- File tmpFile = null;
-
- // create a Writer
- // the following is an ugly hack to allow processing of larger files
- // if xml file size is larger than 500 kb write the fo:file to disk
- if ((xmlfile.length()) > 500000) {
- tmpFile = new File(xmlfile.getName() + ".fo.tmp");
- writer = new FileWriter(tmpFile);
- } else {
- writer = new StringWriter();
- }
-
- XSLTransform.transform(xmlfile.getCanonicalPath(),
- xsltfile.getCanonicalPath(), writer);
-
- writer.flush();
- writer.close();
-
- if (tmpFile != null) {
- reader = new FileReader(tmpFile);
- } else {
- // create a input source containing the xsl:fo file which can be fed to Fop
- reader = new StringReader(writer.toString());
- }
- return new InputSource(reader);
- } catch (Exception ex) {
- ex.printStackTrace();
- return null;
- }
- } else {
- return fileInputSource(xmlfile);
- }
-
- }
-
- /**
- * This looks to see if the Trax api is supported and uses that to
- * get an XMLFilter. Otherwise, it falls back to using DOM documents
- *
- */
- public XMLReader getParser() throws FOPException {
- XMLReader result = null;
- try {
- // try trax first
- Class transformer =
- Class.forName("javax.xml.transform.Transformer");
- transformer =
- Class.forName("org.apache.fop.apps.TraxInputHandler");
- Class[] argTypes = {
- File.class, File.class
- };
- Method getFilterMethod = transformer.getMethod("getXMLFilter",
- argTypes);
- File[] args = {
- xmlfile, xsltfile
- };
- Object obj = getFilterMethod.invoke(null, args);
- if (obj instanceof XMLReader) {
- result = (XMLReader)obj;
- }
- } catch (ClassNotFoundException ex) {
- throw new FOPException(ex);
- } catch (InvocationTargetException ex) {
- throw new FOPException(ex);
- } catch (IllegalAccessException ex) {
- throw new FOPException(ex);
- } catch (NoSuchMethodException ex) {
- throw new FOPException(ex);
- }
- // otherwise, use DOM documents via our XSLTransform tool class old style
- if (result == null) {
- useOldTransform = true;
- result = createParser();
- }
- return result;
-
- }
-
-}
-
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.apps;
-
-// FOP
-import org.apache.fop.fo.XTFOTreeBuilder;
-import org.apache.fop.fo.ElementMapping;
-import org.apache.fop.fo.PropertyListMapping;
-import org.apache.fop.layout.AreaTree;
-import org.apache.fop.layout.FontInfo;
-import org.apache.fop.render.Renderer;
-import org.apache.fop.messaging.MessageHandler;
-
-// DOM
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Attr;
-
-// SAX
-import org.xml.sax.DocumentHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.Parser;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.AttributesImpl;
-
-// Java
-import java.io.*;
-
-/**
- * <P>Primary class that drives overall FOP process.
- *
- * <P>Once this class is instantiated, methods are called to set the
- * Renderer to use, the (possibly multiple) ElementMapping(s) to
- * use and the PrintWriter to use to output the results of the
- * rendering (where applicable). In the case of the Renderer and
- * ElementMapping(s), the Driver may be supplied either with the
- * object itself, or the name of the class, in which case Driver will
- * instantiate the class itself. The advantage of the latter is it
- * enables runtime determination of Renderer and ElementMapping(s).
- *
- * <P>Once the Driver is set up, the buildFOTree method
- * is called. Depending on whether DOM or SAX is being used, the
- * invocation of the method is either buildFOTree(Document) or
- * buildFOTree(Parser, InputSource) respectively.
- *
- * <P>A third possibility may be used to build the FO Tree, namely
- * calling getDocumentHandler() and firing the SAX events yourself.
- *
- * <P>Once the FO Tree is built, the format() and render() methods may be
- * called in that order.
- *
- * <P>Here is an example use of Driver from CommandLine.java:
- *
- * <PRE>
- * Driver driver = new Driver();
- * driver.setRenderer("org.apache.fop.render.pdf.PDFRenderer", version);
- * driver.addElementMapping("org.apache.fop.fo.StandardElementMapping");
- * driver.addElementMapping("org.apache.fop.svg.SVGElementMapping");
- * driver.setWriter(new PrintWriter(new FileWriter(args[1])));
- * driver.buildFOTree(parser, fileInputSource(args[0]));
- * driver.format();
- * driver.render();
- * </PRE>
- */
-public class XTDriver {
-
- /**
- * the FO tree builder
- */
- protected XTFOTreeBuilder treeBuilder;
-
- /**
- * the area tree that is the result of formatting the FO tree
- */
- protected AreaTree areaTree;
-
- /**
- * the renderer to use to output the area tree
- */
- protected Renderer renderer;
-
- /**
- * the PrintWriter to use to output the results of the renderer
- */
- protected PrintWriter writer;
-
- /**
- * the stream to use to output the results of the renderer
- */
- protected OutputStream stream;
-
- /**
- * create a new Driver
- */
- public XTDriver() {
- this.treeBuilder = new XTFOTreeBuilder();
- }
-
- /**
- * set the Renderer to use
- */
- public void setRenderer(Renderer renderer) {
- this.renderer = renderer;
- }
-
- /**
- * set the class name of the Renderer to use as well as the
- * producer string for those renderers that can make use of it
- */
- public void setRenderer(String rendererClassName, String producer) {
- this.renderer = createRenderer(rendererClassName);
- this.renderer.setProducer(producer);
- }
-
- /**
- * protected method used by setRenderer(String, String) to
- * instantiate the Renderer class
- */
- protected Renderer createRenderer(String rendererClassName) {
- MessageHandler.logln("using renderer " + rendererClassName);
-
- try {
- return (Renderer)Class.forName(rendererClassName).newInstance();
- } catch (ClassNotFoundException e) {
- MessageHandler.errorln("Could not find " + rendererClassName);
- } catch (InstantiationException e) {
- MessageHandler.errorln("Could not instantiate "
- + rendererClassName);
- } catch (IllegalAccessException e) {
- MessageHandler.errorln("Could not access " + rendererClassName);
- } catch (ClassCastException e) {
- MessageHandler.errorln(rendererClassName + " is not a renderer");
- }
- return null;
- }
-
- /**
- * add the given element mapping.
- *
- * an element mapping maps element names to Java classes
- */
- public void addElementMapping(ElementMapping mapping) {
- mapping.addToBuilder(this.treeBuilder);
- }
-
- /**
- * add the element mapping with the given class name
- */
- public void addElementMapping(String mappingClassName) {
- createElementMapping(mappingClassName).addToBuilder(this.treeBuilder);
- }
-
- /**
- * protected method used by addElementMapping(String) to
- * instantiate element mapping class
- */
- protected ElementMapping createElementMapping(String mappingClassName) {
- MessageHandler.logln("using element mapping " + mappingClassName);
-
- try {
- return (ElementMapping)Class.forName(mappingClassName).newInstance();
- } catch (ClassNotFoundException e) {
- MessageHandler.errorln("Could not find " + mappingClassName);
- } catch (InstantiationException e) {
- MessageHandler.errorln("Could not instantiate "
- + mappingClassName);
- } catch (IllegalAccessException e) {
- MessageHandler.errorln("Could not access " + mappingClassName);
- } catch (ClassCastException e) {
- MessageHandler.errorln(mappingClassName
- + " is not an element mapping");
- }
- return null;
- }
-
- /**
- * return the tree builder (a SAX DocumentHandler).
- *
- * used in situations where SAX is used but not via a FOP-invoked
- * SAX parser. A good example is an XSLT engine that fires SAX
- * events but isn't a SAX Parser itself.
- */
- public DocumentHandler getDocumentHandler() {
- return this.treeBuilder;
- }
-
- /**
- * build the formatting object tree using the given SAX Parser and
- * SAX InputSource
- */
- public void buildFOTree(Parser parser,
- InputSource source) throws FOPException {
-
- parser.setDocumentHandler(this.treeBuilder);
- try {
- parser.parse(source);
- } catch (SAXException e) {
- if (e.getException() instanceof FOPException)
- throw (FOPException)e.getException();
- else
- throw new FOPException(e.getMessage());
- } catch (IOException e) {
- throw new FOPException(e.getMessage());
- }
- }
-
- /**
- * build the formatting object tree using the given DOM Document
- */
- public void buildFOTree(Document document) throws FOPException {
-
- /* most of this code is modified from John Cowan's */
-
- Node currentNode;
- AttributesImpl currentAtts;
-
- /* temporary array for making Strings into character arrays */
- char[] array = null;
-
- currentAtts = new AttributesImpl();
-
- /* start at the document element */
- currentNode = document;
-
- try {
- while (currentNode != null) {
- switch (currentNode.getNodeType()) {
- case Node.DOCUMENT_NODE:
- this.treeBuilder.startDocument();
- break;
- case Node.CDATA_SECTION_NODE:
- case Node.TEXT_NODE:
- String data = currentNode.getNodeValue();
- int datalen = data.length();
- if (array == null || array.length < datalen) {
- /*
- * if the array isn't big enough, make a new
- * one
- */
- array = new char[datalen];
- }
- data.getChars(0, datalen, array, 0);
- this.treeBuilder.characters(array, 0, datalen);
- break;
- case Node.PROCESSING_INSTRUCTION_NODE:
- this.treeBuilder.processingInstruction(currentNode.getNodeName(),
- currentNode.getNodeValue());
- break;
- case Node.ELEMENT_NODE:
- NamedNodeMap map = currentNode.getAttributes();
- currentAtts.clear();
- for (int i = map.getLength() - 1; i >= 0; i--) {
- Attr att = (Attr)map.item(i);
- currentAtts.addAttribute("", att.getName(), "",
- "CDATA", att.getValue());
- }
- this.treeBuilder.startElement("",
- currentNode.getNodeName(),
- "", currentAtts);
- break;
- }
-
- Node nextNode = currentNode.getFirstChild();
- if (nextNode != null) {
- currentNode = nextNode;
- continue;
- }
-
- while (currentNode != null) {
- switch (currentNode.getNodeType()) {
- case Node.DOCUMENT_NODE:
- this.treeBuilder.endDocument();
- break;
- case Node.ELEMENT_NODE:
- this.treeBuilder.endElement("",
- currentNode.getNodeName(),
- "");
- break;
- }
-
- nextNode = currentNode.getNextSibling();
- if (nextNode != null) {
- currentNode = nextNode;
- break;
- }
-
- currentNode = currentNode.getParentNode();
- }
- }
- } catch (SAXException e) {
- throw new FOPException(e.getMessage());
- }
- }
-
- /**
- * set the PrintWriter to use to output the result of the Renderer
- * (if applicable)
- */
- public void setWriter(PrintWriter writer) {
- this.writer = writer;
- }
-
- /**
- * set the OutputStream to use to output the result of the Renderer
- * (if applicable)
- */
- public void setOutputStream(OutputStream stream) {
- this.stream = stream;
- }
-
- /**
- * format the formatting object tree into an area tree
- */
- public void format() throws FOPException {
- FontInfo fontInfo = new FontInfo();
- this.renderer.setupFontInfo(fontInfo);
-
- this.areaTree = new AreaTree();
- this.areaTree.setFontInfo(fontInfo);
-
- this.treeBuilder.format(areaTree);
- }
-
- /**
- * render the area tree to the output form
- */
- public void render() throws IOException, FOPException {
- this.renderer.render(areaTree, this.stream);
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.apps.FOPException;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.datatypes.ColorType;
-
-// Java
-import java.util.Enumeration;
-import java.awt.Rectangle;
-
-public class BasicLink extends FObjMixed {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new BasicLink(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new BasicLink.Maker();
- }
-
- public BasicLink(FObj parent,
- PropertyList propertyList) throws FOPException {
- super(parent, propertyList);
- this.name = "fo:basic-link";
-
- if (parent.getName().equals("fo:flow")) {
- throw new FOPException("basic-link can't be directly"
- + " under flow");
- }
- }
-
- public Status layout(Area area) throws FOPException {
- String destination;
- int linkType;
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Margin Properties-Inline
- MarginInlineProps mProps = propMgr.getMarginInlineProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("alignment-adjust");
- // this.properties.get("alignment-baseline");
- // this.properties.get("baseline-shift");
- // this.properties.get("destination-place-offset");
- // this.properties.get("dominant-baseline");
- // this.properties.get("external-destination");
- // this.properties.get("id");
- // this.properties.get("indicate-destination");
- // this.properties.get("internal-destination");
- // this.properties.get("keep-together");
- // this.properties.get("keep-with-next");
- // this.properties.get("keep-with-previous");
- // this.properties.get("line-height");
- // this.properties.get("line-height-shift-adjustment");
- // this.properties.get("show-destination");
- // this.properties.get("target-processing-context");
- // this.properties.get("target-presentation-context");
- // this.properties.get("target-stylesheet");
-
- if (!(destination =
- this.properties.get("internal-destination").getString()).equals("")) {
- linkType = LinkSet.INTERNAL;
- } else if (!(destination =
- this.properties.get("external-destination").getString()).equals("")) {
- linkType = LinkSet.EXTERNAL;
- } else {
- throw new FOPException("internal-destination or external-destination must be specified in basic-link");
- }
-
- if (this.marker == START) {
- // initialize id
- String id = this.properties.get("id").getString();
- area.getIDReferences().initializeID(id, area);
- this.marker = 0;
- }
-
- // new LinkedArea to gather up inlines
- LinkSet ls = new LinkSet(destination, area, linkType);
-
- Page p = area.getPage();
-
- AreaContainer ac = p.getBody().getCurrentColumnArea();
- if (ac == null) {
- throw new FOPException("Couldn't get ancestor AreaContainer when processing basic-link");
- }
-
- int numChildren = this.children.size();
- for (int i = this.marker; i < numChildren; i++) {
- FONode fo = (FONode)children.elementAt(i);
- fo.setLinkSet(ls);
-
- Status status;
- if ((status = fo.layout(area)).isIncomplete()) {
- this.marker = i;
- return status;
- }
- }
-
- ls.applyAreaContainerOffsets(ac, area);
-
- // pass on command line
- String mergeLinks = System.getProperty("links.merge");
- if ((null != mergeLinks) &&!mergeLinks.equalsIgnoreCase("no")) {
- ls.mergeLinks();
- }
-
- p.addLinkSet(ls);
-
- return new Status(Status.OK);
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.flow.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.AreaTree;
-import org.apache.fop.apps.FOPException;
-
-/**
- */
-public class BidiOverride extends ToBeImplementedElement {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new BidiOverride(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new BidiOverride.Maker();
- }
-
- protected BidiOverride(FObj parent,
- PropertyList propertyList) throws FOPException {
- super(parent, propertyList);
- this.name = "fo:bidi-override";
- }
-
- public Status layout(Area area) throws FOPException {
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Font Properties
- //this.fontState = propMgr.getFontState(area.getFontInfo());
-
- // Common Margin Properties-Inline
- RelativePositionProps mProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("color");
- // this.properties.get("direction");
- // this.properties.get("id");
- // this.properties.get("letter-spacing");
- // this.properties.get("line-height");
- // this.properties.get("line-height-shift-adjustment");
- // this.properties.get("score-spaces");
- // this.properties.get("text-shadow");
- // this.properties.get("text-transform");
- // this.properties.get("unicode-bidi");
- // this.properties.get("word-spacing");
-
- return super.layout(area);
- }
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.datatypes.*;
-import org.apache.fop.apps.FOPException;
-
-/*
- Modified by Mark Lillywhite mark-fop@inomial.com. The changes
- here are based on memory profiling and do not change functionality.
- Essentially, the Block object had a pointer to a BlockArea object
- that it created. The BlockArea was not referenced after the Block
- was finished except to determine the size of the BlockArea, however
- a reference to the BlockArea was maintained and this caused a lot of
- GC problems, and was a major reason for FOP memory leaks. So,
- the reference to BlockArea was made local, the required information
- is now stored (instead of a reference to the complex BlockArea object)
- and it appears that there are a lot of changes in this file, in fact
- there are only a few sematic changes; mostly I just got rid of
- "this." from blockArea since BlockArea is now local.
- */
-
-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();
- }
-
- int align;
- int alignLast;
- int breakAfter;
- int lineHeight;
- int startIndent;
- int endIndent;
- int spaceBefore;
- int spaceAfter;
- int textIndent;
- int keepWithNext;
- ColorType backgroundColor;
- int blockWidows;
- int blockOrphans;
-
- int areaHeight = 0;
- int contentWidth = 0;
-
- String id;
- int span;
-
- // 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 {
- BlockArea blockArea;
-
- // MessageHandler.error(" b:LAY[" + marker + "] ");
-
-
- if (this.marker == BREAK_AFTER) {
- return new Status(Status.OK);
- }
-
- if (this.marker == START) {
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Font Properties
- //this.fontState = propMgr.getFontState(area.getFontInfo());
-
- // Common Hyphenation Properties
- HyphenationProps mHyphProps = propMgr.getHyphenationProps();
-
- // Common Margin Properties-Block
- MarginProps mProps = propMgr.getMarginProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("break-after");
- // this.properties.get("break-before");
- // this.properties.get("color");
- // this.properties.get("text-depth");
- // this.properties.get("text-altitude");
- // this.properties.get("hyphenation-keep");
- // this.properties.get("hyphenation-ladder-count");
- // this.properties.get("id");
- // this.properties.get("keep-together");
- // this.properties.get("keep-with-next");
- // this.properties.get("keep-with-previous");
- // this.properties.get("last-line-end-indent");
- // this.properties.get("linefeed-treatment");
- // this.properties.get("line-height");
- // this.properties.get("line-height-shift-adjustment");
- // this.properties.get("line-stacking-strategy");
- // this.properties.get("orphans");
- // this.properties.get("space-treatment");
- // this.properties.get("span");
- // this.properties.get("text-align");
- // this.properties.get("text-align-last");
- // this.properties.get("text-indent");
- // this.properties.get("visibility");
- // this.properties.get("white-space-collapse");
- // this.properties.get("widows");
- // this.properties.get("wrap-option");
- // this.properties.get("z-index");
-
- this.align = this.properties.get("text-align").getEnum();
- this.alignLast = this.properties.get("text-align-last").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.blockWidows =
- this.properties.get("widows").getNumber().intValue();
- this.blockOrphans =
- this.properties.get("orphans").getNumber().intValue();
-
-
-
- this.id = this.properties.get("id").getString();
-
- if (area instanceof BlockArea) {
- area.end();
- }
-
- if (area.getIDReferences() != null)
- area.getIDReferences().createID(id);
-
- this.marker = 0;
-
- // no break if first in area tree, or leading in context
- // area
- int breakBeforeStatus = propMgr.checkBreakBefore(area);
- if (breakBeforeStatus != Status.OK) {
- return new Status(breakBeforeStatus);
- }
-
- 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();
- blockArea =
- new BlockArea(propMgr.getFontState(area.getFontInfo()),
- area.getAllocationWidth(), area.spaceLeft(),
- startIndent, endIndent, textIndent, align,
- alignLast, lineHeight);
- blockArea.setGeneratedBy(this);
- this.areasGenerated++;
- if (this.areasGenerated == 1)
- blockArea.isFirst(true);
- // for normal areas this should be the only pair
- blockArea.addLineagePair(this, this.areasGenerated);
-
- // markers
- if (this.hasMarkers())
- blockArea.addMarkers(this.getMarkers());
-
- blockArea.setParent(area); // BasicLink needs it
- blockArea.setPage(area.getPage());
- blockArea.setBackgroundColor(backgroundColor);
- blockArea.setBorderAndPadding(propMgr.getBorderAndPadding());
- blockArea.setHyphenation(propMgr.getHyphenationProps());
- 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);
- 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.setMaxHeight(area.getMaxHeight() - spaceLeft
- + blockArea.getMaxHeight());
-
- 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();
- }
- // This is not needed any more and it consumes a LOT
- // of memory. So we release it for the GC.
- areaHeight= blockArea.getHeight();
- contentWidth= blockArea.getContentWidth();
-
- // no break if last in area tree, or trailing in context
- // area
- int breakAfterStatus = propMgr.checkBreakAfter(area);
- if (breakAfterStatus != Status.OK) {
- this.marker = BREAK_AFTER;
- blockArea = null; //Faster GC - BlockArea is big
- return new Status(breakAfterStatus);
- }
-
- if (keepWithNext != 0) {
- blockArea = null; // Faster GC - BlockArea is big
- return new Status(Status.KEEP_WITH_NEXT);
- }
-
- // MessageHandler.error(" b:OK" + marker + " ");
- blockArea.isLast(true);
- blockArea = null; // Faster GC - BlockArea is big
- return new Status(Status.OK);
- }
-
- public int getAreaHeight() {
- return areaHeight;
- }
-
-
- /**
- * Return the content width of the boxes generated by this FO.
- */
- public int getContentWidth() {
- return contentWidth; // getAllocationWidth()??
- }
-
-
- public int getSpan() {
- return this.span;
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.fo.pagination.PageSequence;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-import org.apache.fop.datatypes.*;
-
-// Java
-import java.util.Hashtable;
-import java.util.Enumeration;
-
-public class BlockContainer extends FObj {
-
- ColorType backgroundColor;
- int position;
-
- int top;
- int bottom;
- int left;
- int right;
- int width;
- int height;
-
- int span;
-
- AreaContainer areaContainer;
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new BlockContainer(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new BlockContainer.Maker();
- }
-
- PageSequence pageSequence;
-
- protected BlockContainer(FObj parent,
- PropertyList propertyList) throws FOPException {
- super(parent, propertyList);
- this.name = "fo:block-container";
- this.span = this.properties.get("span").getEnum();
- }
-
- public Status layout(Area area) throws FOPException {
- if (this.marker == START) {
-
- // Common Accessibility Properties
- AbsolutePositionProps mAbsProps = propMgr.getAbsolutePositionProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Margin-Block Properties
- MarginProps mProps = propMgr.getMarginProps();
-
- // this.properties.get("block-progression-dimension");
- // this.properties.get("break-after");
- // this.properties.get("break-before");
- // this.properties.get("clip");
- // this.properties.get("display-align");
- // this.properties.get("height");
- // this.properties.get("id");
- // this.properties.get("keep-together");
- // this.properties.get("keep-with-next");
- // this.properties.get("keep-with-previous");
- // this.properties.get("overflow");
- // this.properties.get("reference-orientation");
- // this.properties.get("span");
- // this.properties.get("width");
- // this.properties.get("writing-mode");
-
- this.marker = 0;
-
- this.backgroundColor =
- this.properties.get("background-color").getColorType();
-
- this.position = this.properties.get("position").getEnum();
- this.top = this.properties.get("top").getLength().mvalue();
- this.bottom = this.properties.get("bottom").getLength().mvalue();
- this.left = this.properties.get("left").getLength().mvalue();
- this.right = this.properties.get("right").getLength().mvalue();
- this.width = this.properties.get("width").getLength().mvalue();
- this.height = this.properties.get("height").getLength().mvalue();
- span = this.properties.get("span").getEnum();
-
- // initialize id
- String id = this.properties.get("id").getString();
- area.getIDReferences().initializeID(id, area);
- }
-
- boolean prevChildMustKeepWithNext = false;
-
- AreaContainer container = (AreaContainer)area;
- if ((this.width == 0) && (this.height == 0)) {
- width = right - left;
- height = bottom - top;
- }
-
- this.areaContainer =
- new AreaContainer(propMgr.getFontState(container.getFontInfo()),
- container.getXPosition() + left,
- container.getYPosition() - top, width, height,
- position);
-
- areaContainer.setPage(area.getPage());
- areaContainer.setBackgroundColor(backgroundColor);
- areaContainer.setBorderAndPadding(propMgr.getBorderAndPadding());
- areaContainer.start();
-
- areaContainer.setAbsoluteHeight(area.getAbsoluteHeight());
- areaContainer.setIDReferences(area.getIDReferences());
-
- int numChildren = this.children.size();
- for (int i = this.marker; i < numChildren; i++) {
- FObj fo = (FObj)children.elementAt(i);
- Status status;
- if ((status = fo.layout(areaContainer)).isIncomplete()) {
- /*
- * if ((prevChildMustKeepWithNext) && (status.laidOutNone())) {
- * this.marker = i - 1;
- * FObj prevChild = (FObj) children.elementAt(this.marker);
- * prevChild.removeAreas();
- * prevChild.resetMarker();
- * return new Status(Status.AREA_FULL_SOME);
- * // should probably return AREA_FULL_NONE if first
- * // or perhaps an entirely new status code
- * } else {
- * this.marker = i;
- * return status;
- * }
- */
- }
- if (status.getCode() == Status.KEEP_WITH_NEXT) {
- prevChildMustKeepWithNext = true;
- }
- }
- area.setAbsoluteHeight(areaContainer.getAbsoluteHeight());
-
- areaContainer.end();
- if (position == Position.ABSOLUTE)
- areaContainer.setHeight(height);
- area.addChild(areaContainer);
-
- return new Status(Status.OK);
- }
-
- /**
- * Return the content width of the boxes generated by this block
- * container FO.
- */
- public int getContentWidth() {
- if (areaContainer != null)
- return areaContainer.getContentWidth(); // getAllocationWidth()??
- else
- return 0; // not laid out yet
- }
-
- public boolean generatesReferenceAreas() {
- return true;
- }
-
- public int getSpan() {
- return this.span;
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// fop
-import org.apache.fop.fo.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.datatypes.ColorType;
-import org.apache.fop.layout.BlockArea;
-import org.apache.fop.layout.*;
-import org.apache.fop.layout.inline.InlineArea;
-import org.apache.fop.fo.FObj;
-import org.apache.fop.layout.FontState;
-import org.apache.fop.layout.LineArea;
-import org.apache.fop.apps.FOPException;
-import org.apache.fop.messaging.MessageHandler;
-
-
-/**
- * this class represents the flow object 'fo:character'. Its use is defined by
- * the spec: "The fo:character flow object represents a character that is mapped to
- * a glyph for presentation. It is an atomic unit to the formatter.
- * When the result tree is interpreted as a tree of formatting objects,
- * a character in the result tree is treated as if it were an empty
- * element of type fo:character with a character attribute
- * equal to the Unicode representation of the character.
- * The semantics of an "auto" value for character properties, which is
- * typically their initial value, are based on the Unicode codepoint.
- * Overrides may be specified in an implementation-specific manner." (6.6.3)
- *
- */
-public class Character extends FObj {
- public final static int OK = 0;
- public final static int DOESNOT_FIT = 1;
-
- public Character(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:character";
- }
-
- public static FObj.Maker maker() {
- return new Character.Maker();
- }
-
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new Character(parent, propertyList);
- }
-
- }
-
-
- public Status layout(Area area) throws FOPException {
- BlockArea blockArea;
- if (!(area instanceof BlockArea)) {
- MessageHandler.errorln("WARNING: currently Character can only be in a BlockArea");
- return new Status(Status.OK);
- }
- blockArea = (BlockArea)area;
- boolean textDecoration;
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Font Properties
- //this.fontState = propMgr.getFontState(area.getFontInfo());
-
- // Common Hyphenation Properties
- HyphenationProps mHyphProps = propMgr.getHyphenationProps();
-
- // Common Margin Properties-Inline
- MarginInlineProps mProps = propMgr.getMarginInlineProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("alignment-adjust");
- // this.properties.get("treat-as-word-space");
- // this.properties.get("alignment-baseline");
- // this.properties.get("baseline-shift");
- // this.properties.get("character");
- // this.properties.get("color");
- // this.properties.get("dominant-baseline");
- // this.properties.get("text-depth");
- // this.properties.get("text-altitude");
- // this.properties.get("glyph-orientation-horizontal");
- // this.properties.get("glyph-orientation-vertical");
- // this.properties.get("id");
- // this.properties.get("keep-with-next");
- // this.properties.get("keep-with-previous");
- // this.properties.get("letter-spacing");
- // this.properties.get("line-height");
- // this.properties.get("line-height-shift-adjustment");
- // this.properties.get("score-spaces");
- // this.properties.get("suppress-at-line-break");
- // this.properties.get("text-decoration");
- // this.properties.get("text-shadow");
- // this.properties.get("text-transform");
- // this.properties.get("word-spacing");
-
- // color properties
- ColorType c = this.properties.get("color").getColorType();
- float red = c.red();
- float green = c.green();
- float blue = c.blue();
-
- int whiteSpaceCollapse =
- this.properties.get("white-space-collapse").getEnum();
- int wrapOption = this.parent.properties.get("wrap-option").getEnum();
-
- int tmp = this.properties.get("text-decoration").getEnum();
- if (tmp == org.apache.fop.fo.properties.TextDecoration.UNDERLINE) {
- textDecoration = true;
- } else {
- textDecoration = false;
- }
-
- // Character specific properties
- char characterValue = this.properties.get("character").getCharacter();
-
-
- // initialize id
- String id = this.properties.get("id").getString();
- blockArea.getIDReferences().initializeID(id, blockArea);
-
- LineArea la = blockArea.getCurrentLineArea();
- if (la == null) {
- return new Status(Status.AREA_FULL_NONE);
- }
- la.changeFont(propMgr.getFontState(area.getFontInfo()));
- la.changeColor(red, green, blue);
- la.changeWrapOption(wrapOption);
- la.changeWhiteSpaceCollapse(whiteSpaceCollapse);
- blockArea.setupLinkSet(this.getLinkSet());
- int result = la.addCharacter(characterValue, this.getLinkSet(),
- textDecoration);
- if (result == Character.DOESNOT_FIT) {
- la = blockArea.createNextLineArea();
- if (la == null) {
- return new Status(Status.AREA_FULL_NONE);
- }
- la.changeFont(propMgr.getFontState(area.getFontInfo()));
- la.changeColor(red, green, blue);
- la.changeWrapOption(wrapOption);
- la.changeWhiteSpaceCollapse(whiteSpaceCollapse);
- blockArea.setupLinkSet(this.getLinkSet());
- la.addCharacter(characterValue, this.getLinkSet(),
- textDecoration);
- }
- return new Status(Status.OK);
-
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-import org.apache.fop.image.*;
-
-// Java
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.net.URL;
-import java.net.MalformedURLException;
-
-public class ExternalGraphic extends FObj {
-
- int breakAfter;
- int breakBefore;
- int align;
- int startIndent;
- int endIndent;
- int spaceBefore;
- int spaceAfter;
- String src;
- int height;
- int width;
- String id;
-
- ImageArea imageArea;
-
-
- public ExternalGraphic(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:external-graphic";
- }
-
-
- public Status layout(Area area) throws FOPException {
-
- if (this.marker == START) {
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Margin Properties-Inline
- MarginInlineProps mProps = propMgr.getMarginInlineProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("alignment-adjust");
- // this.properties.get("alignment-baseline");
- // this.properties.get("baseline-shift");
- // this.properties.get("block-progression-dimension");
- // this.properties.get("content-height");
- // this.properties.get("content-type");
- // this.properties.get("content-width");
- // this.properties.get("display-align");
- // this.properties.get("dominant-baseline");
- // this.properties.get("height");
- // this.properties.get("id");
- // this.properties.get("inline-progression-dimension");
- // this.properties.get("keep-with-next");
- // this.properties.get("keep-with-previous");
- // this.properties.get("line-height");
- // this.properties.get("line-height-shift-adjustment");
- // this.properties.get("overflow");
- // this.properties.get("scaling");
- // this.properties.get("scaling-method");
- // this.properties.get("src");
- // this.properties.get("text-align");
- // this.properties.get("width");
-
- // FIXME
- this.align = this.properties.get("text-align").getEnum();
-
- 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.src = this.properties.get("src").getString();
-
- this.width = this.properties.get("width").getLength().mvalue();
-
- this.height = this.properties.get("height").getLength().mvalue();
-
- this.id = this.properties.get("id").getString();
-
- area.getIDReferences().createID(id);
- /*
- * if (area instanceof BlockArea) {
- * area.end();
- * }
- * if (this.isInTableCell) {
- * startIndent += forcedStartOffset;
- * endIndent = area.getAllocationWidth() - forcedWidth -
- * forcedStartOffset;
- * }
- */
- this.marker = 0;
- }
-
- try {
- FopImage img = FopImageFactory.Make(src);
- // if width / height needs to be computed
- if ((width == 0) || (height == 0)) {
- // aspect ratio
- double imgWidth = img.getWidth();
- double imgHeight = img.getHeight();
- if ((width == 0) && (height == 0)) {
- width = (int)((imgWidth * 1000d));
- height = (int)((imgHeight * 1000d));
- } else if (height == 0) {
- height = (int)((imgHeight * ((double)width)) / imgWidth);
- } else if (width == 0) {
- width = (int)((imgWidth * ((double)height)) / imgHeight);
- }
- }
-
- // scale image if it doesn't fit in the area/page
- // Need to be more tested...
- double ratio = ((double)width) / ((double)height);
- int areaWidth = area.getAllocationWidth() - startIndent
- - endIndent;
- int pageHeight = area.getPage().getHeight();
- if (height > pageHeight) {
- height = pageHeight;
- width = (int)(ratio * ((double)height));
- }
- if (width > areaWidth) {
- width = areaWidth;
- height = (int)(((double)width) / ratio);
- }
-
- if (area.spaceLeft() < (height + spaceBefore)) {
- return new Status(Status.AREA_FULL_NONE);
- }
-
- this.imageArea =
- new ImageArea(propMgr.getFontState(area.getFontInfo()), img,
- area.getAllocationWidth(), width, height,
- startIndent, endIndent, align);
-
- if ((spaceBefore != 0) && (this.marker == 0)) {
- area.addDisplaySpace(spaceBefore);
- }
-
- if (marker == 0) {
- // configure id
- area.getIDReferences().configureID(id, area);
- }
-
- imageArea.start();
- imageArea.end();
- // area.addChild(imageArea);
- // area.increaseHeight(imageArea.getHeight());
-
- if (spaceAfter != 0) {
- area.addDisplaySpace(spaceAfter);
- }
- if (breakBefore == BreakBefore.PAGE
- || ((spaceBefore + imageArea.getHeight())
- > area.spaceLeft())) {
- 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 (area instanceof BlockArea) {
- BlockArea ba = (BlockArea)area;
- LineArea la = ba.getCurrentLineArea();
- if (la == null) {
- return new Status(Status.AREA_FULL_NONE);
- }
- la.addPending();
- if (imageArea.getContentWidth() > la.getRemainingWidth()) {
- la = ba.createNextLineArea();
- if (la == null) {
- return new Status(Status.AREA_FULL_NONE);
- }
- }
- la.addInlineArea(imageArea);
- } else {
- area.addChild(imageArea);
- area.increaseHeight(imageArea.getContentHeight());
- }
- imageArea.setPage(area.getPage());
-
- 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);
- }
-
-
-
-
-
- } catch (MalformedURLException urlex) {
- // bad URL
- MessageHandler.errorln("Error while creating area : "
- + urlex.getMessage());
- } catch (FopImageException imgex) {
- // image error
- MessageHandler.errorln("Error while creating area : "
- + imgex.getMessage());
- }
-
- // if (area instanceof BlockArea) {
- // area.start();
- // }
-
- return new Status(Status.OK);
- }
-
-
- public static FObj.Maker maker() {
- return new ExternalGraphic.Maker();
- }
-
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new ExternalGraphic(parent, propertyList);
- }
-
- }
-}
-
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.flow.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-
-/**
- */
-public class Float extends ToBeImplementedElement {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new Float(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new Float.Maker();
- }
-
- protected Float(FObj parent,
- PropertyList propertyList) throws FOPException {
- super(parent, propertyList);
- this.name = "fo:float";
- }
-
- public Status layout(Area area) throws FOPException {
-
- // this.properties.get("float");
- // this.properties.get("clear");
-
- return super.layout(area);
- }
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.fo.pagination.*;
-import org.apache.fop.layout.Area;
-import org.apache.fop.layout.BodyAreaContainer;
-import org.apache.fop.apps.FOPException;
-import org.apache.fop.messaging.MessageHandler;
-
-// Java
-import java.util.Hashtable;
-import java.util.Enumeration;
-import java.util.Vector;
-
-public class Flow extends FObj {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new Flow(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new Flow.Maker();
- }
-
- /**
- * PageSequence container
- */
- private PageSequence pageSequence;
-
- /**
- * Area in which we lay out our kids
- */
- private Area area;
-
- /**
- * Vector to store snapshot
- */
- private Vector markerSnapshot;
-
- /**
- * flow-name attribute
- */
- private String _flowName;
-
- private Status _status = new Status(Status.AREA_FULL_NONE);
-
-
- protected Flow(FObj parent,
- PropertyList propertyList) throws FOPException {
- super(parent, propertyList);
- this.name = getElementName();
-
- if (parent.getName().equals("fo:page-sequence")) {
- this.pageSequence = (PageSequence)parent;
- } else {
- throw new FOPException("flow must be child of "
- + "page-sequence, not "
- + parent.getName());
- }
- setFlowName(getProperty("flow-name").getString());
-
- // according to communication from Paul Grosso (XSL-List,
- // 001228, Number 406), confusion in spec section 6.4.5 about
- // multiplicity of fo:flow in XSL 1.0 is cleared up - one (1)
- // fo:flow per fo:page-sequence only.
-
- if (pageSequence.isFlowSet()) {
- if (this.name.equals("fo:flow")) {
- throw new FOPException("Only a single fo:flow permitted"
- + " per fo:page-sequence");
- } else {
- throw new FOPException(this.name
- + " not allowed after fo:flow");
- }
- }
- pageSequence.addFlow(this);
- }
-
- protected void setFlowName(String name) throws FOPException {
- if (name == null || name.equals("")) {
- MessageHandler.errorln("WARNING: A 'flow-name' is required for "
- + getElementName()
- + ". This constraint will be enforced in future versions of FOP");
- _flowName = "xsl-region-body";
- } else {
- _flowName = name;
- }
-
- }
-
- public String getFlowName() {
- return _flowName;
- }
-
- public Status layout(Area area) throws FOPException {
- return layout(area, null);
-
- }
-
- public Status layout(Area area, Region region) throws FOPException {
- if (this.marker == START) {
- this.marker = 0;
- }
-
- // flow is *always* laid out into a BodyAreaContainer
- BodyAreaContainer bac = (BodyAreaContainer)area;
-
- boolean prevChildMustKeepWithNext = false;
- Vector pageMarker = this.getMarkerSnapshot(new Vector());
-
- int numChildren = this.children.size();
- if (numChildren == 0) {
- throw new FOPException("fo:flow must contain block-level children");
- }
- for (int i = this.marker; i < numChildren; i++) {
- FObj fo = (FObj)children.elementAt(i);
-
- if (bac.isBalancingRequired(fo)) {
- // reset the the just-done span area in preparation
- // for a backtrack for balancing
- bac.resetSpanArea();
-
- this.rollback(markerSnapshot);
- // one less because of the "continue"
- i = this.marker - 1;
- continue;
- }
- // current column area
- Area currentArea = bac.getNextArea(fo);
- // temporary hack for IDReferences
- currentArea.setIDReferences(bac.getIDReferences());
- if (bac.isNewSpanArea()) {
- this.marker = i;
- markerSnapshot = this.getMarkerSnapshot(new Vector());
- }
-
- _status = fo.layout(currentArea);
-
- /*
- * if((_status.isPageBreak() || i == numChildren - 1) && bac.needsFootnoteAdjusting()) {
- * bac.adjustFootnoteArea();
- * this.rollback(pageMarker);
- * i = this.marker - 1;
- * Area mainReferenceArea = bac.getMainReferenceArea();
- * // remove areas
- * continue;
- * }
- */
- if (_status.isIncomplete()) {
- if ((prevChildMustKeepWithNext) && (_status.laidOutNone())) {
- this.marker = i - 1;
- FObj prevChild = (FObj)children.elementAt(this.marker);
- prevChild.removeAreas();
- prevChild.resetMarker();
- prevChild.removeID(area.getIDReferences());
- _status = new Status(Status.AREA_FULL_SOME);
- return _status;
- // should probably return AREA_FULL_NONE if first
- // or perhaps an entirely new status code
- }
- if (bac.isLastColumn())
- if (_status.getCode() == Status.FORCE_COLUMN_BREAK) {
- this.marker = i;
- _status =
- new Status(Status.FORCE_PAGE_BREAK); // same thing
- return _status;
- } else {
- this.marker = i;
- return _status;
- }
- else {
- // not the last column, but could be page breaks
- if (_status.isPageBreak()) {
- this.marker = i;
- return _status;
- }
- // I don't much like exposing this. (AHS 001217)
- ((org.apache.fop.layout.ColumnArea)currentArea).incrementSpanIndex();
- i--;
- }
- }
- if (_status.getCode() == Status.KEEP_WITH_NEXT) {
- prevChildMustKeepWithNext = true;
- } else {
- prevChildMustKeepWithNext = false;
- }
- }
- return _status;
- }
-
- /**
- * Return the content width of this flow (really of the region
- * in which it is flowing).
- */
- public int getContentWidth() {
- if (area != null)
- return area.getContentWidth(); // getAllocationWidth()??
- else
- return 0; // not laid out yet
- }
-
- protected String getElementName() {
- return "fo:flow";
- }
-
- public Status getStatus() {
- return _status;
- }
-
-
- public boolean generatesReferenceAreas() {
- return true;
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.messaging.*;
-
-// Java
-import java.util.Enumeration;
-import java.util.Vector;
-
-public class Footnote extends FObj {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new Footnote(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new Footnote.Maker();
- }
-
- public Footnote(FObj parent,
- PropertyList propertyList) throws FOPException {
- super(parent, propertyList);
- this.name = "fo:footnote";
- }
-
- public Status layout(Area area) throws FOPException {
- FONode inline = null;
- FONode fbody = null;
- if (this.marker == START) {
- this.marker = 0;
- }
- int numChildren = this.children.size();
- for (int i = this.marker; i < numChildren; i++) {
- FONode fo = (FONode)children.elementAt(i);
- if (fo instanceof Inline) {
- inline = fo;
- Status status = fo.layout(area);
- if (status.isIncomplete()) {
- return status;
- }
- } else if (inline != null && fo instanceof FootnoteBody) {
- // add footnote to current page or next if it can't fit
- fbody = fo;
- if (area instanceof BlockArea) {
- ((BlockArea)area).addFootnote((FootnoteBody)fbody);
- } else {
- Page page = area.getPage();
- layoutFootnote(page, (FootnoteBody)fbody, area);
- }
- }
- }
- if (fbody == null) {
- MessageHandler.errorln("WARNING: no footnote-body in footnote");
- }
- if (area instanceof BlockArea) {}
- return new Status(Status.OK);
- }
-
- public static boolean layoutFootnote(Page p, FootnoteBody fb, Area area) {
- try {
- BodyAreaContainer bac = p.getBody();
- AreaContainer footArea = bac.getFootnoteReferenceArea();
- footArea.setIDReferences(bac.getIDReferences());
- int basePos = footArea.getCurrentYPosition()
- - footArea.getHeight();
- int oldHeight = footArea.getHeight();
- if (area != null) {
- footArea.setMaxHeight(area.getMaxHeight() - area.getHeight()
- + footArea.getHeight());
- } else {
- footArea.setMaxHeight(bac.getMaxHeight()
- + footArea.getHeight());
- }
- Status status = fb.layout(footArea);
- if (status.isIncomplete()) {
- // add as a pending footnote
- return false;
- } else {
- if (area != null) {
- area.setMaxHeight(area.getMaxHeight()
- - footArea.getHeight() + oldHeight);
- }
- // bac.setMaxHeight(bac.getMaxHeight() - footArea.getHeight() + oldHeight);
- if (bac.getFootnoteState() == 0) {
- Area ar = bac.getMainReferenceArea();
- decreaseMaxHeight(ar, footArea.getHeight() - oldHeight);
- footArea.setYPosition(basePos + footArea.getHeight());
- }
- }
- } catch (FOPException fope) {
- return false;
- }
- return true;
- }
-
- protected static void decreaseMaxHeight(Area ar, int change) {
- ar.setMaxHeight(ar.getMaxHeight() - change);
- Vector childs = ar.getChildren();
- for (Enumeration en = childs.elements(); en.hasMoreElements(); ) {
- Object obj = en.nextElement();
- if (obj instanceof Area) {
- Area childArea = (Area)obj;
- decreaseMaxHeight(childArea, change);
- }
- }
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.layout.Area;
-import org.apache.fop.layout.AreaClass;
-import org.apache.fop.apps.FOPException;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-
-// Java
-import java.util.Enumeration;
-
-public class FootnoteBody extends FObj {
-
- int align;
- int alignLast;
- int lineHeight;
- int startIndent;
- int endIndent;
- int textIndent;
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new FootnoteBody(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new FootnoteBody.Maker();
- }
-
- public FootnoteBody(FObj parent,
- PropertyList propertyList) throws FOPException {
- super(parent, propertyList);
- this.name = "fo:footnote-body";
- this.areaClass = AreaClass.setAreaClass(AreaClass.XSL_FOOTNOTE);
- }
-
- public Status layout(Area area) throws FOPException {
- if (this.marker == START) {
- this.marker = 0;
- }
- BlockArea blockArea =
- new BlockArea(propMgr.getFontState(area.getFontInfo()),
- area.getAllocationWidth(), area.spaceLeft(),
- startIndent, endIndent, textIndent, align,
- alignLast, lineHeight);
- blockArea.setGeneratedBy(this);
- blockArea.isFirst(true);
- blockArea.setPage(area.getPage());
- 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);
- Status status;
- if ((status = fo.layout(blockArea)).isIncomplete()) {
- this.resetMarker();
- return status;
- }
- }
- blockArea.end();
- area.addChild(blockArea);
- area.increaseHeight(blockArea.getHeight());
- blockArea.isLast(true);
- return new Status(Status.OK);
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.flow.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.AreaTree;
-import org.apache.fop.apps.FOPException;
-
-/**
- */
-public class InitialPropertySet extends ToBeImplementedElement {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new InitialPropertySet(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new InitialPropertySet.Maker();
- }
-
- protected InitialPropertySet(FObj parent, PropertyList propertyList)
- throws FOPException {
- super(parent, propertyList);
- this.name = "fo:initial-property-set";
- }
-
- public Status layout(Area area) throws FOPException {
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Font Properties
- //this.fontState = propMgr.getFontState(area.getFontInfo());
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("color");
- // this.properties.get("id");
- // this.properties.get("letter-spacing");
- // this.properties.get("line-height");
- // this.properties.get("line-height-shift-adjustment");
- // this.properties.get("score-spaces");
- // this.properties.get("text-decoration");
- // this.properties.get("text-shadow");
- // this.properties.get("text-transform");
- // this.properties.get("word-spacing");
-
- return super.layout(area);
- }
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-import org.apache.fop.fo.properties.*;
-
-// Java
-import java.util.Enumeration;
-
-public class Inline extends FObjMixed {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new Inline(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new Inline.Maker();
- }
-
- // Textdecoration
- protected boolean underlined = false;
- protected boolean overlined = false;
- protected boolean lineThrough = false;
-
-
- public Inline(FObj parent,
- PropertyList propertyList) throws FOPException {
- super(parent, propertyList);
- this.name = "fo:inline";
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Font Properties
- //this.fontState = propMgr.getFontState(area.getFontInfo());
-
- // Common Margin Properties-Inline
- MarginInlineProps mProps = propMgr.getMarginInlineProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("alignment-adjust");
- // this.properties.get("alignment-baseline");
- // this.properties.get("baseline-shift");
- // this.properties.get("color");
- // this.properties.get("dominant-baseline");
- // this.properties.get("id");
- // this.properties.get("keep-together");
- // this.properties.get("keep-with-next");
- // this.properties.get("keep-with-previous");
- // this.properties.get("line-height");
- // this.properties.get("line-height-shift-adjustment");
- // this.properties.get("text-devoration");
- // this.properties.get("visibility");
- // this.properties.get("z-index");
-
- int textDecoration = this.properties.get("text-decoration").getEnum();
-
- if (textDecoration == TextDecoration.UNDERLINE) {
- this.underlined = true;
- }
-
- if (textDecoration == TextDecoration.OVERLINE) {
- this.overlined = true;
- }
-
- if (textDecoration == TextDecoration.LINE_THROUGH) {
- this.lineThrough = true;
- }
-
- if (parent.getName().equals("fo:flow")) {
- throw new FOPException("fo:inline can't be directly"
- + " under flow");
- }
-
- }
-
- protected void addCharacters(char data[], int start, int length) {
- FOText ft = new FOText(data, start, length, this);
- ft.setUnderlined(underlined);
- ft.setOverlined(overlined);
- ft.setLineThrough(lineThrough);
- children.addElement(ft);
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.flow.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-
-/**
- */
-public class InlineContainer extends ToBeImplementedElement {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new InlineContainer(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new InlineContainer.Maker();
- }
-
- protected InlineContainer(FObj parent,
- PropertyList propertyList) throws FOPException {
- super(parent, propertyList);
- this.name = "fo:inline-container";
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Margin Properties-Inline
- MarginInlineProps mProps = propMgr.getMarginInlineProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("alignment-adjust");
- // this.properties.get("alignment-baseline");
- // this.properties.get("baseline-shift");
- // this.properties.get("block-progression-dimension");
- // this.properties.get("clip");
- // this.properties.get("display-align");
- // this.properties.get("dominant-baseline");
- // this.properties.get("height");
- // this.properties.get("id");
- // this.properties.get("inline-progression-dimension");
- // this.properties.get("keep-together");
- // this.properties.get("keep-with-next");
- // this.properties.get("keep-with-previous");
- // this.properties.get("line-height");
- // this.properties.get("line-height-shift-adjustment");
- // this.properties.get("overflow");
- // this.properties.get("reference-orientation");
- // this.properties.get("width");
- // this.properties.get("writing-mode");
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.layout.inline.*;
-import org.apache.fop.layout.BlockArea;
-import org.apache.fop.layout.FontState;
-import org.apache.fop.apps.FOPException;
-
-// Java
-import java.util.Enumeration;
-
-public class InstreamForeignObject extends FObj {
-
- /**
- * inner class for making SVG objects.
- */
- public static class Maker extends FObj.Maker {
-
- /**
- * make an SVG object.
- *
- * @param parent the parent formatting object
- * @param propertyList the explicit properties of this object
- *
- * @return the SVG object
- */
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new InstreamForeignObject(parent, propertyList);
- }
-
- }
-
- /**
- * returns the maker for this object.
- *
- * @return the maker for SVG objects
- */
- public static FObj.Maker maker() {
- return new InstreamForeignObject.Maker();
- }
-
- int breakBefore;
- int breakAfter;
- int scaling;
- int width;
- int height;
- int contwidth;
- int contheight;
- boolean wauto;
- boolean hauto;
- boolean cwauto;
- boolean chauto;
- int spaceBefore;
- int spaceAfter;
- int startIndent;
- int endIndent;
-
- ForeignObjectArea areaCurrent;
-
- /**
- * constructs an instream-foreign-object object (called by Maker).
- *
- * @param parent the parent formatting object
- * @param propertyList the explicit properties of this object
- */
- public InstreamForeignObject(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:instream-foreign-object";
- }
-
- /**
- * layout this formatting object.
- *
- * @param area the area to layout the object into
- *
- * @return the status of the layout
- */
- public Status layout(Area area) throws FOPException {
-
- if (this.marker == BREAK_AFTER) {
- return new Status(Status.OK);
- }
-
- if (this.marker == START) {
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Margin Properties-Inline
- MarginInlineProps mProps = propMgr.getMarginInlineProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("alignment-adjust");
- // this.properties.get("alignment-baseline");
- // this.properties.get("baseline-shift");
- // this.properties.get("block-progression-dimension");
- // this.properties.get("content-height");
- // this.properties.get("content-type");
- // this.properties.get("content-width");
- // this.properties.get("display-align");
- // this.properties.get("dominant-baseline");
- // this.properties.get("height");
- // this.properties.get("id");
- // this.properties.get("inline-progression-dimension");
- // this.properties.get("keep-with-next");
- // this.properties.get("keep-with-previous");
- // this.properties.get("line-height");
- // this.properties.get("line-height-shift-adjustment");
- // this.properties.get("overflow");
- // this.properties.get("scaling");
- // this.properties.get("scaling-method");
- // this.properties.get("text-align");
- // this.properties.get("width");
-
- /* retrieve properties */
- String id = this.properties.get("id").getString();
- int align = this.properties.get("text-align").getEnum();
- int valign = this.properties.get("vertical-align").getEnum();
- int overflow = this.properties.get("overflow").getEnum();
-
- this.breakBefore = this.properties.get("break-before").getEnum();
- this.breakAfter = this.properties.get("break-after").getEnum();
- this.width = this.properties.get("width").getLength().mvalue();
- this.height = this.properties.get("height").getLength().mvalue();
- this.contwidth =
- this.properties.get("content-width").getLength().mvalue();
- this.contheight =
- this.properties.get("content-height").getLength().mvalue();
- this.wauto = this.properties.get("width").getLength().isAuto();
- this.hauto = this.properties.get("height").getLength().isAuto();
- this.cwauto =
- this.properties.get("content-width").getLength().isAuto();
- this.chauto =
- this.properties.get("content-height").getLength().isAuto();
-
- 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.scaling = this.properties.get("scaling").getEnum();
-
- area.getIDReferences().createID(id);
- if (this.areaCurrent == null) {
- this.areaCurrent =
- new ForeignObjectArea(propMgr.getFontState(area.getFontInfo()),
- area.getAllocationWidth());
-
- this.areaCurrent.start();
- areaCurrent.setWidth(this.width);
- areaCurrent.setHeight(this.height);
- areaCurrent.setContentWidth(this.contwidth);
- areaCurrent.setContentHeight(this.contheight);
- areaCurrent.setScaling(this.scaling);
- areaCurrent.setAlign(align);
- areaCurrent.setVerticalAlign(valign);
- areaCurrent.setOverflow(overflow);
- areaCurrent.setSizeAuto(wauto, hauto);
- areaCurrent.setContentSizeAuto(cwauto, chauto);
-
- // this means that children can get the fontstate
- areaCurrent.setPage(area.getPage());
-
- int numChildren = this.children.size();
- if (numChildren > 1) {
- throw new FOPException("Only one child element is allowed in an instream-foreign-object");
- }
- /* layout foreign object */
- if (this.children.size() > 0) {
- FONode fo = (FONode)children.elementAt(0);
- Status status;
- // currently FONode must be an SVG
- if ((status =
- fo.layout(this.areaCurrent)).isIncomplete()) {
- return status;
- }
-
- /* finish off the foreign object area */
- this.areaCurrent.end();
- }
- }
-
- this.marker = 0;
-
- if (breakBefore == BreakBefore.PAGE
- || ((spaceBefore + areaCurrent.getEffectiveHeight())
- > area.spaceLeft())) {
- 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 (this.areaCurrent == null) {
- return new Status(Status.OK);
- }
-
- if (area instanceof BlockArea) {
- BlockArea ba = (BlockArea)area;
- LineArea la = ba.getCurrentLineArea();
- if (la == null) {
- return new Status(Status.AREA_FULL_NONE);
- }
- la.addPending();
- if (areaCurrent.getEffectiveWidth() > la.getRemainingWidth()) {
- la = ba.createNextLineArea();
- if (la == null) {
- return new Status(Status.AREA_FULL_NONE);
- }
- }
- la.addInlineArea(areaCurrent);
- } else {
- area.addChild(areaCurrent);
- area.increaseHeight(areaCurrent.getEffectiveHeight());
- }
-
- if (this.isInTableCell) {
- startIndent += forcedStartOffset;
- /*
- * endIndent = areaCurrent.getEffectiveWidth() - forcedWidth -
- * forcedStartOffset;
- */
- }
-
- areaCurrent.setStartIndent(startIndent);
- // areaCurrent.setEndIndent(endIndent);
-
- /* if there is a space-before */
- if (spaceBefore != 0) {
- /* add a display space */
- // area.addDisplaySpace(spaceBefore);
- }
-
- /* add the SVG area to the containing area */
- // area.addChild(areaCurrent);
-
- areaCurrent.setPage(area.getPage());
-
- /* increase the height of the containing area accordingly */
- // area.increaseHeight(areaCurrent.getEffectiveHeight());
-
- /* if there is a space-after */
- if (spaceAfter != 0) {
- /* add a display space */
- // area.addDisplaySpace(spaceAfter);
- }
-
-
- 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);
- }
-
- areaCurrent = null;
- /* return status */
- return new Status(Status.OK);
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.datatypes.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.layout.BlockArea;
-import org.apache.fop.layout.inline.LeaderArea;
-import org.apache.fop.layout.LineArea;
-import org.apache.fop.layout.FontState;
-import org.apache.fop.apps.FOPException;
-import org.apache.fop.messaging.MessageHandler;
-
-/**
- * Implements fo:leader; main property of leader leader-pattern.
- * The following patterns are treated: rule, space, dots.
- * The pattern use-content is ignored, i.e. it still must be implemented.
- */
-
-public class Leader extends FObjMixed {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new Leader(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new Leader.Maker();
- }
-
- public Leader(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:leader";
- }
-
- public Status layout(Area area) throws FOPException {
- BlockArea blockArea;
- // restriction in this version
- if (!(area instanceof BlockArea)) {
- MessageHandler.errorln("WARNING: in this version of Fop fo:leader must be a direct child of fo:block ");
- return new Status(Status.OK);
- } else {
- blockArea = (BlockArea)area;
- }
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Font Properties
- //this.fontState = propMgr.getFontState(area.getFontInfo());
-
- // Common Margin Properties-Inline
- MarginInlineProps mProps = propMgr.getMarginInlineProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("alignment-adjust");
- // this.properties.get("alignment-baseline");
- // this.properties.get("baseline-shift");
- // this.properties.get("color");
- // this.properties.get("dominant-baseline");
- // this.properties.get("text-depth");
- // this.properties.get("text-altitude");
- // this.properties.get("id");
- // this.properties.get("leader-alignment");
- // this.properties.get("leader-length");
- // this.properties.get("leader-pattern");
- // this.properties.get("leader-pattern-width");
- // this.properties.get("rule-style");
- // this.properties.get("rule-thickness");
- // this.properties.get("letter-spacing");
- // this.properties.get("line-height");
- // this.properties.get("line-height-shift-adjustment");
- // this.properties.get("text-shadow");
- // this.properties.get("visibility");
- // this.properties.get("word-spacing");
- // this.properties.get("z-index");
-
- // color properties
- ColorType c = this.properties.get("color").getColorType();
- float red = c.red();
- float green = c.green();
- float blue = c.blue();
-
- // fo:leader specific properties
- // determines the pattern of leader; allowed values: space, rule,dots, use-content
- int leaderPattern = this.properties.get("leader-pattern").getEnum();
- // length of the leader
- int leaderLengthOptimum =
- this.properties.get("leader-length.optimum").getLength().mvalue();
- int leaderLengthMinimum =
- this.properties.get("leader-length.minimum").getLength().mvalue();
- int leaderLengthMaximum =
- this.properties.get("leader-length.maximum").getLength().mvalue();
- // the following properties only apply for leader-pattern = "rule"
- int ruleThickness =
- this.properties.get("rule-thickness").getLength().mvalue();
- int ruleStyle = this.properties.get("rule-style").getEnum();
- // if leaderPatternWidth = 0 = default = use-font-metric
- int leaderPatternWidth =
- this.properties.get("leader-pattern-width").getLength().mvalue();
- int leaderAlignment =
- this.properties.get("leader-alignment").getEnum();
-
- // initialize id
- String id = this.properties.get("id").getString();
- blockArea.getIDReferences().initializeID(id, blockArea);
-
- // adds leader to blockarea, there the leaderArea is generated
- int succeeded = addLeader(blockArea,
- propMgr.getFontState(area.getFontInfo()),
- red, green, blue, leaderPattern,
- leaderLengthMinimum, leaderLengthOptimum,
- leaderLengthMaximum, ruleThickness,
- ruleStyle, leaderPatternWidth,
- leaderAlignment);
- if (succeeded == 1) {
- return new Status(Status.OK);
- } else {
- // not sure that this is the correct Status here
- return new Status(Status.AREA_FULL_SOME);
- }
- }
-
- /*
- * //should only be necessary for use-content
- * protected void addCharacters(char data[], int start, int length) {
- * FOText textNode = new FOText(data,start,length, this);
- * children.addElement(textNode);
- * }
- */
-
-
- /**
- * adds a leader to current line area of containing block area
- * the actual leader area is created in the line area
- *
- * @return int +1 for success and -1 for none
- */
- public int addLeader(BlockArea ba, FontState fontState, float red,
- float green, float blue, int leaderPattern,
- int leaderLengthMinimum, int leaderLengthOptimum,
- int leaderLengthMaximum, int ruleThickness,
- int ruleStyle, int leaderPatternWidth,
- int leaderAlignment) {
-
- LineArea la = ba.getCurrentLineArea();
- // this should start a new page
- if (la == null) {
- return -1;
- }
-
- la.changeFont(fontState);
- la.changeColor(red, green, blue);
-
- // check whether leader fits into the (rest of the) line
- // using length.optimum to determine where to break the line as defined
- // in the xsl:fo spec: "User agents may choose to use the value of 'leader-length.optimum'
- // to determine where to break the line" (7.20.4)
- // if leader is longer then create a new LineArea and put leader there
- if (leaderLengthOptimum <= (la.getRemainingWidth())) {
- la.addLeader(leaderPattern, leaderLengthMinimum,
- leaderLengthOptimum, leaderLengthMaximum, ruleStyle,
- ruleThickness, leaderPatternWidth, leaderAlignment);
- } else {
- la = ba.createNextLineArea();
- if (la == null) {
- // not enough room
- return -1;
- }
- la.changeFont(fontState);
- la.changeColor(red, green, blue);
-
- // check whether leader fits into LineArea at all, otherwise
- // clip it (should honor the clip option of containing area)
- if (leaderLengthMinimum <= la.getContentWidth()) {
- la.addLeader(leaderPattern, leaderLengthMinimum,
- leaderLengthOptimum, leaderLengthMaximum,
- ruleStyle, ruleThickness, leaderPatternWidth,
- leaderAlignment);
- } else {
- MessageHandler.errorln("Leader doesn't fit into line, it will be clipped to fit.");
- la.addLeader(leaderPattern, la.getRemainingWidth(),
- leaderLengthOptimum, leaderLengthMaximum,
- ruleStyle, ruleThickness, leaderPatternWidth,
- leaderAlignment);
- }
- }
- // this.hasLines = true;
- return 1;
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.datatypes.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.layout.BlockArea;
-import org.apache.fop.layout.FontState;
-import org.apache.fop.apps.FOPException;
-
-// Java
-import java.util.Enumeration;
-
-public class ListBlock extends FObj {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new ListBlock(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new ListBlock.Maker();
- }
-
- int align;
- int alignLast;
- int breakBefore;
- int breakAfter;
- int lineHeight;
- int startIndent;
- int endIndent;
- int spaceBefore;
- int spaceAfter;
- int spaceBetweenListRows = 0;
- ColorType backgroundColor;
-
- public ListBlock(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:list-block";
- }
-
- public Status layout(Area area) throws FOPException {
- if (this.marker == START) {
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Margin Properties-Block
- MarginProps mProps = propMgr.getMarginProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("break-after");
- // this.properties.get("break-before");
- // this.properties.get("id");
- // this.properties.get("keep-together");
- // this.properties.get("keep-with-next");
- // this.properties.get("keep-with-previous");
- // this.properties.get("provisional-distance-between-starts");
- // this.properties.get("provisional-label-separation");
-
- this.align = this.properties.get("text-align").getEnum();
- this.alignLast = this.properties.get("text-align-last").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.spaceBetweenListRows = 0; // not used at present
- this.backgroundColor =
- this.properties.get("background-color").getColorType();
-
- this.marker = 0;
-
- if (area instanceof BlockArea) {
- area.end();
- }
-
- if (spaceBefore != 0) {
- area.addDisplaySpace(spaceBefore);
- }
-
- if (this.isInTableCell) {
- startIndent += forcedStartOffset;
- endIndent += area.getAllocationWidth() - forcedWidth
- - forcedStartOffset;
- }
-
- // initialize id
- String id = this.properties.get("id").getString();
- area.getIDReferences().initializeID(id, area);
- }
-
- BlockArea blockArea =
- new BlockArea(propMgr.getFontState(area.getFontInfo()),
- area.getAllocationWidth(), area.spaceLeft(),
- startIndent, endIndent, 0, align, alignLast,
- lineHeight);
- blockArea.setGeneratedBy(this);
- this.areasGenerated++;
- if (this.areasGenerated == 1)
- blockArea.isFirst(true);
- // for normal areas this should be the only pair
- blockArea.addLineagePair(this, this.areasGenerated);
-
- // markers
- if (this.hasMarkers())
- blockArea.addMarkers(this.getMarkers());
-
-
- blockArea.setPage(area.getPage());
- blockArea.setBackgroundColor(backgroundColor);
- blockArea.start();
-
- blockArea.setAbsoluteHeight(area.getAbsoluteHeight());
- blockArea.setIDReferences(area.getIDReferences());
-
- int numChildren = this.children.size();
- for (int i = this.marker; i < numChildren; i++) {
- if (!(children.elementAt(i) instanceof ListItem)) {
- MessageHandler.errorln("children of list-blocks must be list-items");
- return new Status(Status.OK);
- }
- ListItem listItem = (ListItem)children.elementAt(i);
- Status status;
- if ((status = listItem.layout(blockArea)).isIncomplete()) {
- if (status.getCode() == Status.AREA_FULL_NONE && i > 0) {
- status = new Status(Status.AREA_FULL_SOME);
- }
- this.marker = i;
- blockArea.end();
- area.addChild(blockArea);
- area.increaseHeight(blockArea.getHeight());
- area.setAbsoluteHeight(blockArea.getAbsoluteHeight());
- return status;
- }
- }
-
- blockArea.end();
- area.addChild(blockArea);
- area.increaseHeight(blockArea.getHeight());
- area.setAbsoluteHeight(blockArea.getAbsoluteHeight());
-
- if (spaceAfter != 0) {
- area.addDisplaySpace(spaceAfter);
- }
-
- if (area instanceof BlockArea) {
- area.start();
- }
-
- blockArea.isLast(true);
- return new Status(Status.OK);
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.layout.BlockArea;
-import org.apache.fop.layout.FontState;
-import org.apache.fop.apps.FOPException;
-
-// Java
-import java.util.Enumeration;
-
-public class ListItem extends FObj {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new ListItem(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new ListItem.Maker();
- }
-
- int align;
- int alignLast;
- int breakBefore;
- int breakAfter;
- int lineHeight;
- int startIndent;
- int endIndent;
- int spaceBefore;
- int spaceAfter;
- String id;
- BlockArea blockArea;
-
- public ListItem(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:list-item";
- }
-
- public Status layout(Area area) throws FOPException {
- if (this.marker == START) {
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Margin Properties-Block
- MarginProps mProps = propMgr.getMarginProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("break-after");
- // this.properties.get("break-before");
- // this.properties.get("id");
- // this.properties.get("keep-together");
- // this.properties.get("keep-with-next");
- // this.properties.get("keep-with-previous");
- // this.properties.get("relative-align");
-
- this.align = this.properties.get("text-align").getEnum();
- this.alignLast = this.properties.get("text-align-last").getEnum();
- this.lineHeight =
- this.properties.get("line-height").getLength().mvalue();
- this.spaceBefore =
- this.properties.get("space-before.optimum").getLength().mvalue();
- this.spaceAfter =
- this.properties.get("space-after.optimum").getLength().mvalue();
- this.id = this.properties.get("id").getString();
-
- area.getIDReferences().createID(id);
-
- this.marker = 0;
- }
-
- /* not sure this is needed given we know area is from list block */
- if (area instanceof BlockArea) {
- area.end();
- }
-
- if (spaceBefore != 0) {
- area.addDisplaySpace(spaceBefore);
- }
-
- this.blockArea =
- new BlockArea(propMgr.getFontState(area.getFontInfo()),
- area.getAllocationWidth(), area.spaceLeft(), 0, 0,
- 0, align, alignLast, lineHeight);
- this.blockArea.setGeneratedBy(this);
- this.areasGenerated++;
- if (this.areasGenerated == 1)
- this.blockArea.isFirst(true);
- // for normal areas this should be the only pair
- this.blockArea.addLineagePair(this, this.areasGenerated);
-
- // markers
- if (this.hasMarkers())
- this.blockArea.addMarkers(this.getMarkers());
-
- blockArea.setPage(area.getPage());
- blockArea.start();
-
- blockArea.setAbsoluteHeight(area.getAbsoluteHeight());
- blockArea.setIDReferences(area.getIDReferences());
-
- int numChildren = this.children.size();
- if (numChildren != 2) {
- throw new FOPException("list-item must have exactly two children");
- }
- ListItemLabel label = (ListItemLabel)children.elementAt(0);
- ListItemBody body = (ListItemBody)children.elementAt(1);
-
- Status status;
-
- // what follows doesn't yet take into account whether the
- // body failed completely or only got some text in
-
- if (this.marker == 0) {
- // configure id
- area.getIDReferences().configureID(id, area);
-
- status = label.layout(blockArea);
- if (status.isIncomplete()) {
- return status;
- }
- }
-
- status = body.layout(blockArea);
- if (status.isIncomplete()) {
- blockArea.end();
- area.addChild(blockArea);
- area.increaseHeight(blockArea.getHeight());
- area.setAbsoluteHeight(blockArea.getAbsoluteHeight());
- this.marker = 1;
- return status;
- }
-
- blockArea.end();
- area.addChild(blockArea);
- area.increaseHeight(blockArea.getHeight());
- area.setAbsoluteHeight(blockArea.getAbsoluteHeight());
-
- if (spaceAfter != 0) {
- area.addDisplaySpace(spaceAfter);
- }
-
- /* not sure this is needed given we know area is from list block */
- if (area instanceof BlockArea) {
- area.start();
- }
- this.blockArea.isLast(true);
- return new Status(Status.OK);
- }
-
- /**
- * 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
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.layout.FontState;
-import org.apache.fop.apps.FOPException;
-
-// Java
-import java.util.Enumeration;
-
-public class ListItemBody extends FObj {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new ListItemBody(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new ListItemBody.Maker();
- }
-
- public ListItemBody(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:list-item-body";
- }
-
- public Status layout(Area area) throws FOPException {
- if (this.marker == START) {
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // this.properties.get("id");
- // this.properties.get("keep-together");
-
- this.marker = 0;
- // initialize id
- String id = this.properties.get("id").getString();
- area.getIDReferences().initializeID(id, area);
- }
-
- /*
- * For calculating the lineage - The fo:list-item-body formatting object
- * does not generate any areas. The fo:list-item-body formatting object
- * returns the sequence of areas created by concatenating the sequences
- * of areas returned by each of the children of the fo:list-item-body.
- */
-
- int numChildren = this.children.size();
- for (int i = this.marker; i < numChildren; i++) {
- FObj fo = (FObj)children.elementAt(i);
-
- Status status;
- if ((status = fo.layout(area)).isIncomplete()) {
- this.marker = i;
- if ((i == 0) && (status.getCode() == Status.AREA_FULL_NONE)) {
- return new Status(Status.AREA_FULL_NONE);
- } else {
- return new Status(Status.AREA_FULL_SOME);
- }
- }
- }
- return new Status(Status.OK);
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.layout.FontState;
-import org.apache.fop.apps.FOPException;
-
-// Java
-import java.util.Enumeration;
-
-public class ListItemLabel extends FObj {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new ListItemLabel(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new ListItemLabel.Maker();
- }
-
- public ListItemLabel(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:list-item-label";
- }
-
- public Status layout(Area area) throws FOPException {
- int numChildren = this.children.size();
-
- if (numChildren != 1) {
- throw new FOPException("list-item-label must have exactly one block in this version of FOP");
- }
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // this.properties.get("id");
- // this.properties.get("keep-together");
-
- // initialize id
- String id = this.properties.get("id").getString();
- area.getIDReferences().initializeID(id, area);
-
- Block block = (Block)children.elementAt(0);
-
- /*
- * For calculating the lineage - The fo:list-item-label formatting object
- * does not generate any areas. The fo:list-item-label formatting object
- * returns the sequence of areas created by concatenating the sequences
- * of areas returned by each of the children of the fo:list-item-label.
- */
-
- Status status;
- status = block.layout(area);
- area.addDisplaySpace(-block.getAreaHeight());
- return status;
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.datatypes.*;
-import org.apache.fop.apps.FOPException;
-
-public class Marker extends FObjMixed {
-
- private String markerClassName;
- private Area registryArea;
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new Marker(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new Marker.Maker();
- }
-
- public Marker(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:marker";
-
- // do check to see that 'this' is under fo:flow
-
- this.markerClassName =
- this.properties.get("marker-class-name").getString();
-
- // check to ensure that no other marker with same parent
- // has this 'marker-class-name' is in addMarker() method
- try {
- parent.addMarker(this);
- } catch (FOPException fopex) {
- MessageHandler.error("marker cannot be added to '" + parent
- + "'");
- }
- }
-
- public Status layout(Area area) throws FOPException {
- // no layout action desired
- this.registryArea = area;
- area.addMarker(this);
- area.getPage().registerMarker(this);
- // System.out.println("Marker being registered in area '" + area + "'");
- return new Status(Status.OK);
- }
-
- public Status layoutMarker(Area area) throws FOPException {
- if (this.marker == START)
- this.marker = 0;
-
- int numChildren = this.children.size();
- for (int i = this.marker; i < numChildren; i++) {
- FONode fo = (FONode)children.elementAt(i);
-
- Status status;
- if ((status = fo.layout(area)).isIncomplete()) {
- this.marker = i;
- return status;
- }
- }
-
- return new Status(Status.OK);
- }
-
- public String getMarkerClassName() {
- return markerClassName;
- }
-
- public Area getRegistryArea() {
- return registryArea;
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.flow.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-
-/**
- */
-public class MultiCase extends ToBeImplementedElement {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new MultiCase(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new MultiCase.Maker();
- }
-
- protected MultiCase(FObj parent,
- PropertyList propertyList) throws FOPException {
- super(parent, propertyList);
- this.name = "fo:multi-case";
- }
-
- public Status layout(Area area) throws FOPException {
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // this.properties.get("id");
- // this.properties.get("starting-state");
- // this.properties.get("case-name");
- // this.properties.get("case-title");
-
- return super.layout(area);
- }
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.flow.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-
-/**
- */
-public class MultiProperties extends ToBeImplementedElement {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new MultiProperties(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new MultiProperties.Maker();
- }
-
- protected MultiProperties(FObj parent,
- PropertyList propertyList) throws FOPException {
- super(parent, propertyList);
- this.name = "fo:multi-properties";
- }
-
- public Status layout(Area area) throws FOPException {
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // this.properties.get("id");
-
- return super.layout(area);
- }
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.flow.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-
-/**
- */
-public class MultiPropertySet extends ToBeImplementedElement {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new MultiPropertySet(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new MultiPropertySet.Maker();
- }
-
- protected MultiPropertySet(FObj parent, PropertyList propertyList)
- throws FOPException {
- super(parent, propertyList);
- this.name = "fo:multi-property-set";
- }
-
- public Status layout(Area area) throws FOPException {
-
- // this.properties.get("id");
- // this.properties.get("active-state");
-
- return super.layout(area);
- }
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.flow.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-
-/**
- */
-public class MultiSwitch extends ToBeImplementedElement {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new MultiSwitch(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new MultiSwitch.Maker();
- }
-
- protected MultiSwitch(FObj parent,
- PropertyList propertyList) throws FOPException {
- super(parent, propertyList);
- this.name = "fo:multi-switch";
- }
-
- public Status layout(Area area) throws FOPException {
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // this.properties.get("auto-restore");
- // this.properties.get("id");
-
- return super.layout(area);
- }
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.flow.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-
-/**
- */
-public class MultiToggle extends ToBeImplementedElement {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new MultiToggle(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new MultiToggle.Maker();
- }
-
- protected MultiToggle(FObj parent,
- PropertyList propertyList) throws FOPException {
- super(parent, propertyList);
- this.name = "fo:multi-toggle";
- }
-
- public Status layout(Area area) throws FOPException {
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // this.properties.get("id");
- // this.properties.get("switch-to");
-
- return super.layout(area);
- }
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.datatypes.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-
-// Java
-import java.util.Enumeration;
-
-public class PageNumber extends FObj {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new PageNumber(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new PageNumber.Maker();
- }
-
- float red;
- float green;
- float blue;
- int wrapOption;
- int whiteSpaceCollapse;
- TextState ts;
-
- public PageNumber(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:page-number";
- }
-
- public Status layout(Area area) throws FOPException {
- if (!(area instanceof BlockArea)) {
- MessageHandler.errorln("WARNING: page-number outside block area");
- return new Status(Status.OK);
- }
- if (this.marker == START) {
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Font Properties
- //this.fontState = propMgr.getFontState(area.getFontInfo());
-
- // Common Margin Properties-Inline
- MarginInlineProps mProps = propMgr.getMarginInlineProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("alignment-adjust");
- // this.properties.get("alignment-baseline");
- // this.properties.get("baseline-shift");
- // this.properties.get("dominant-baseline");
- // this.properties.get("id");
- // this.properties.get("keep-with-next");
- // this.properties.get("keep-with-previous");
- // this.properties.get("letter-spacing");
- // this.properties.get("line-height");
- // this.properties.get("line-height-shift-adjustment");
- // this.properties.get("score-spaces");
- // this.properties.get("text-decoration");
- // this.properties.get("text-shadow");
- // this.properties.get("text-transform");
- // this.properties.get("word-spacing");
-
- ColorType c = this.properties.get("color").getColorType();
- this.red = c.red();
- this.green = c.green();
- this.blue = c.blue();
-
- this.wrapOption = this.properties.get("wrap-option").getEnum();
- this.whiteSpaceCollapse =
- this.properties.get("white-space-collapse").getEnum();
- ts = new TextState();
- this.marker = 0;
-
- // initialize id
- String id = this.properties.get("id").getString();
- area.getIDReferences().initializeID(id, area);
- }
-
- String p = area.getPage().getFormattedNumber();
- this.marker = FOText.addText((BlockArea)area,
- propMgr.getFontState(area.getFontInfo()),
- red, green, blue, wrapOption, null,
- whiteSpaceCollapse, p.toCharArray(), 0,
- p.length(), ts, VerticalAlign.BASELINE);
- return new Status(Status.OK);
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.pagination.*;
-import org.apache.fop.datatypes.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-
-
-/**
- * 6.6.11 fo:page-number-citation
- *
- * Common Usage:
- * The fo:page-number-citation is used to reference the page-number for the page containing the first normal area returned by
- * the cited formatting object.
- *
- * NOTE:
- * It may be used to provide the page-numbers in the table of contents, cross-references, and index entries.
- *
- * Areas:
- * The fo:page-number-citation formatting object generates and returns a single normal inline-area.
- * Constraints:
- *
- * The cited page-number is the number of the page containing, as a descendant, the first normal area returned by the
- * formatting object with an id trait matching the ref-id trait of the fo:page-number-citation (the referenced formatting
- * object).
- *
- * The cited page-number string is obtained by converting the cited page-number in accordance with the number to string
- * conversion properties specified on the ancestor fo:page-sequence of the referenced formatting object.
- *
- * The child areas of the generated inline-area are the same as the result of formatting a result-tree fragment consisting of
- * fo:character flow objects; one for each character in the cited page-number string and with only the "character" property
- * specified.
- *
- * Contents:
- *
- * EMPTY
- *
- * The following properties apply to this formatting object:
- *
- * [7.3 Common Accessibility Properties]
- * [7.5 Common Aural Properties]
- * [7.6 Common Border, Padding, and Background Properties]
- * [7.7 Common Font Properties]
- * [7.10 Common Margin Properties-Inline]
- * [7.11.1 "alignment-adjust"]
- * [7.11.2 "baseline-identifier"]
- * [7.11.3 "baseline-shift"]
- * [7.11.5 "dominant-baseline"]
- * [7.36.2 "id"]
- * [7.17.4 "keep-with-next"]
- * [7.17.5 "keep-with-previous"]
- * [7.14.2 "letter-spacing"]
- * [7.13.4 "line-height"]
- * [7.13.5 "line-height-shift-adjustment"]
- * [7.36.5 "ref-id"]
- * [7.18.4 "relative-position"]
- * [7.36.6 "score-spaces"]
- * [7.14.4 "text-decoration"]
- * [7.14.5 "text-shadow"]
- * [7.14.6 "text-transform"]
- * [7.14.8 "word-spacing"]
- */
-public class PageNumberCitation extends FObj {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new PageNumberCitation(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new PageNumberCitation.Maker();
- }
-
- float red;
- float green;
- float blue;
- int wrapOption;
- int whiteSpaceCollapse;
- Area area;
- String pageNumber;
- String refId;
- String id;
- TextState ts;
-
-
- public PageNumberCitation(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:page-number-citation";
- }
-
-
- public Status layout(Area area) throws FOPException {
- if (!(area instanceof BlockArea)) {
- MessageHandler.errorln("WARNING: page-number-citation outside block area");
- return new Status(Status.OK);
- }
-
- IDReferences idReferences = area.getIDReferences();
- this.area = area;
- if (this.marker == START) {
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Font Properties
- //this.fontState = propMgr.getFontState(area.getFontInfo());
-
- // Common Margin Properties-Inline
- MarginInlineProps mProps = propMgr.getMarginInlineProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("alignment-adjust");
- // this.properties.get("alignment-baseline");
- // this.properties.get("baseline-shift");
- // this.properties.get("dominant-baseline");
- // this.properties.get("id");
- // this.properties.get("keep-with-next");
- // this.properties.get("keep-with-previous");
- // this.properties.get("letter-spacing");
- // this.properties.get("line-height");
- // this.properties.get("line-height-shift-adjustment");
- // this.properties.get("ref-id");
- // this.properties.get("score-spaces");
- // this.properties.get("text-decoration");
- // this.properties.get("text-shadow");
- // this.properties.get("text-transform");
- // this.properties.get("word-spacing");
-
- ColorType c = this.properties.get("color").getColorType();
- this.red = c.red();
- this.green = c.green();
- this.blue = c.blue();
-
- this.wrapOption = this.properties.get("wrap-option").getEnum();
- this.whiteSpaceCollapse =
- this.properties.get("white-space-collapse").getEnum();
-
- this.refId = this.properties.get("ref-id").getString();
-
- if (this.refId.equals("")) {
- throw new FOPException("page-number-citation must contain \"ref-id\"");
- }
-
- // create id
- this.id = this.properties.get("id").getString();
- idReferences.createID(id);
- ts = new TextState();
-
- this.marker = 0;
- }
-
- if (marker == 0) {
- idReferences.configureID(id, area);
- }
-
-
- pageNumber = idReferences.getPageNumber(refId);
-
- if (pageNumber != null) { // if we already know the page number
- this.marker =
- FOText.addText((BlockArea)area,
- propMgr.getFontState(area.getFontInfo()), red,
- green, blue, wrapOption, null,
- whiteSpaceCollapse, pageNumber.toCharArray(),
- 0, pageNumber.length(), ts,
- VerticalAlign.BASELINE);
- } else { // add pageNumberCitation to area to be resolved during rendering
- BlockArea blockArea = (BlockArea)area;
- LineArea la = blockArea.getCurrentLineArea();
- if (la == null) {
- return new Status(Status.AREA_FULL_NONE);
- }
- la.changeFont(propMgr.getFontState(area.getFontInfo()));
- la.changeColor(red, green, blue);
- la.changeWrapOption(wrapOption);
- la.changeWhiteSpaceCollapse(whiteSpaceCollapse);
- /*
- * la.changeHyphenation(language, country, hyphenate,
- * hyphenationChar, hyphenationPushCharacterCount,
- * hyphenationRemainCharacterCount);
- */
-
- // blockArea.setupLinkSet(null);
- la.addPageNumberCitation(refId, null);
- this.marker = -1;
- }
-
-
- if (this.marker == -1) {
- return new Status(Status.OK);
- } else {
- return new Status(Status.AREA_FULL_NONE);
- }
-
- }
-
-}
-
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.datatypes.*;
-import org.apache.fop.apps.FOPException;
-
-// Java
-import java.util.Vector;
-
-public class RetrieveMarker extends FObjMixed {
-
- private String retrieveClassName;
- private int retrievePosition;
- private int retrieveBoundary;
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new RetrieveMarker(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new RetrieveMarker.Maker();
- }
-
- public RetrieveMarker(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:retrieve-marker";
-
- this.retrieveClassName =
- this.properties.get("retrieve-class-name").getString();
- this.retrievePosition =
- this.properties.get("retrieve-position").getEnum();
- this.retrieveBoundary =
- this.properties.get("retrieve-boundary").getEnum();
- }
-
- public Status layout(Area area) throws FOPException {
- // locate qualifying areas by 'marker-class-name' and
- // 'retrieve-boundary'. Initially we will always check
- // the containing page
- Page containingPage = area.getPage();
- Marker bestMarker = searchPage(containingPage, true);
-
- // if marker not yet found, and 'retrieve-boundary' permits,
- // search forward by Page
- if ((null == bestMarker)
- && (retrieveBoundary != RetrieveBoundary.PAGE)) {
- // System.out.println("Null bestMarker and searching...");
- Page currentPage = containingPage;
- boolean isFirstCall = true;
- while (bestMarker == null) {
- Page previousPage = locatePreviousPage(currentPage,
- retrieveBoundary,
- isFirstCall);
- isFirstCall = false;
- // System.out.println("Previous page = '" + previousPage + "'");
- bestMarker = searchPage(previousPage, false);
- currentPage = previousPage;
- }
- }
-
- Status status = new Status(Status.AREA_FULL_NONE);
- if (null != bestMarker) {
- // System.out.println("Laying out marker '" + bestMarker + "' in area '" + area + "'");
- // the 'markers' referred to in this method are internal; they have
- // nothing to do with fo:marker
- bestMarker.resetMarker();
- status = bestMarker.layoutMarker(area);
- }
-
- return status;
- }
-
- private Marker searchPage(Page page,
- boolean isContainingPage) throws FOPException {
- Vector pageMarkers = page.getMarkers();
- if (pageMarkers.isEmpty()) {
- // System.out.println("No markers on page");
- return null;
- }
-
- // if no longer the containing page (fo:retrieve-marker, or the page
- // being processed), grab the last qualifying marker on this one
- if (!isContainingPage) {
- for (int c = pageMarkers.size(); c > 0; c--) {
- Marker currentMarker = (Marker)pageMarkers.elementAt(c - 1);
- if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
- return currentMarker;
- }
- }
- }
-
- // search forward if 'first-starting-within-page' or
- // 'first-including-carryover'
- if (retrievePosition == RetrievePosition.FIC) {
- for (int c = 0; c < pageMarkers.size(); c++) {
- Marker currentMarker = (Marker)pageMarkers.elementAt(c);
- if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
- return currentMarker;
- }
- }
-
- } else if (retrievePosition == RetrievePosition.FSWP) {
- for (int c = 0; c < pageMarkers.size(); c++) {
- Marker currentMarker = (Marker)pageMarkers.elementAt(c);
- if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
- if (currentMarker.getRegistryArea().isFirst()) {
- return currentMarker;
- }
- }
- }
-
- } else if (retrievePosition == RetrievePosition.LSWP) {
- for (int c = pageMarkers.size(); c > 0; c--) {
- Marker currentMarker = (Marker)pageMarkers.elementAt(c - 1);
- if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
- if (currentMarker.getRegistryArea().isFirst()) {
- return currentMarker;
- }
- }
- }
-
- } else if (retrievePosition == RetrievePosition.LEWP) {
- for (int c = pageMarkers.size(); c > 0; c--) {
- Marker currentMarker = (Marker)pageMarkers.elementAt(c - 1);
- if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
- if (currentMarker.getRegistryArea().isLast()) {
- return currentMarker;
- }
- }
- }
-
- } else {
- throw new FOPException("Illegal 'retrieve-position' value");
- }
- return null;
- }
-
- private Page locatePreviousPage(Page page, int retrieveBoundary,
- boolean isFirstCall) {
- boolean pageWithinSequence = true;
- if (retrieveBoundary == RetrieveBoundary.DOCUMENT)
- pageWithinSequence = false;
- return page.getAreaTree().getPreviousPage(page, pageWithinSequence,
- isFirstCall);
- }
-
-}
+++ /dev/null
-/*
- * -- $Id$ --
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-import org.apache.fop.layout.Area;
-import java.util.Enumeration;
-
-public class RowSpanMgr {
- class SpanInfo {
- int cellHeight;
- int totalRowHeight;
- int rowsRemaining;
- // int numCols; // both V and H span
- TableCell cell;
-
- SpanInfo(TableCell cell, int cellHeight, int rowsSpanned) {
- this.cell = cell;
- this.cellHeight = cellHeight;
- this.totalRowHeight = 0;
- this.rowsRemaining = rowsSpanned;
- }
-
- /**
- * Return the height remaining in the span.
- */
- int heightRemaining() {
- int hl = cellHeight - totalRowHeight;
- return (hl > 0) ? hl : 0;
- }
-
- boolean isInLastRow() {
- return (rowsRemaining == 1);
- }
-
- boolean finishRow(int rowHeight) {
- totalRowHeight += rowHeight;
- if (--rowsRemaining == 0) {
- if (cell != null) {
- cell.setRowHeight(totalRowHeight);
- }
- return true;
- } else
- return false;
- }
-
- }
-
- private SpanInfo spanInfo[];
-
- public RowSpanMgr(int numCols) {
- this.spanInfo = new SpanInfo[numCols];
- }
-
- public void addRowSpan(TableCell cell, int firstCol, int numCols,
- int cellHeight, int rowsSpanned) {
- spanInfo[firstCol - 1] = new SpanInfo(cell, cellHeight, rowsSpanned);
- for (int i = 0; i < numCols - 1; i++) {
- spanInfo[firstCol + i] = new SpanInfo(null, cellHeight,
- rowsSpanned); // copy!
- }
- }
-
- public boolean isSpanned(int colNum) {
- return (spanInfo[colNum - 1] != null);
- }
-
-
- public TableCell getSpanningCell(int colNum) {
- if (spanInfo[colNum - 1] != null) {
- return spanInfo[colNum - 1].cell;
- } else
- return null;
- }
-
-
- /**
- * Return true if any column has an unfinished vertical span.
- */
- public boolean hasUnfinishedSpans() {
- for (int i = 0; i < spanInfo.length; i++) {
- if (spanInfo[i] != null)
- return true;
- }
- return false;
- }
-
- /**
- * Done with a row.
- * Any spans with only one row left are done
- * This means that we can now set the total height for this cell box
- * Loop over all cells with spans and find number of rows remaining
- * if rows remaining = 1, set the height on the cell area and
- * then remove the cell from the list of spanned cells. For other
- * spans, add the rowHeight to the spanHeight.
- */
- public void finishRow(int rowHeight) {
- for (int i = 0; i < spanInfo.length; i++) {
- if (spanInfo[i] != null && spanInfo[i].finishRow(rowHeight))
- spanInfo[i] = null;
- }
- }
-
- /**
- * If the cell in this column is in the last row of its vertical
- * span, return the height left. If it's not in the last row, or if
- * the content height <= the content height of the previous rows
- * of the span, return 0.
- */
- public int getRemainingHeight(int colNum) {
- if (spanInfo[colNum - 1] != null) {
- return spanInfo[colNum - 1].heightRemaining();
- } else
- return 0;
- }
-
- public boolean isInLastRow(int colNum) {
- if (spanInfo[colNum - 1] != null) {
- return spanInfo[colNum - 1].isInLastRow();
- } else
- return false;
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.fo.pagination.*;
-import org.apache.fop.layout.Area;
-import org.apache.fop.apps.FOPException;
-import org.apache.fop.messaging.MessageHandler;
-
-// Java
-import java.util.Enumeration;
-
-public class StaticContent extends Flow {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new StaticContent(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new StaticContent.Maker();
- }
-
- protected StaticContent(FObj parent,
- PropertyList propertyList) throws FOPException {
- super(parent, propertyList);
- ((PageSequence)parent).setIsFlowSet(false); // hacquery of sorts
- }
-
- public Status layout(Area area) throws FOPException {
- return layout(area, null);
- }
-
-
- public Status layout(Area area, Region region) throws FOPException {
-
- int numChildren = this.children.size();
- // Set area absolute height so that link rectangles will be drawn correctly in xsl-before and xsl-after
- String regionClass = "none";
- if (region != null) {
- regionClass = region.getRegionClass();
- } else {
- if (getFlowName().equals("xsl-region-before")) {
- regionClass = RegionBefore.REGION_CLASS;
- } else if (getFlowName().equals("xsl-region-after")) {
- regionClass = RegionAfter.REGION_CLASS;
- } else if (getFlowName().equals("xsl-region-start")) {
- regionClass = RegionStart.REGION_CLASS;
- } else if (getFlowName().equals("xsl-region-end")) {
- regionClass = RegionEnd.REGION_CLASS;
- }
-
- }
-
- if (area instanceof org.apache.fop.layout.AreaContainer)
- ((org.apache.fop.layout.AreaContainer)area).setAreaName(regionClass);
-
- if (regionClass.equals(RegionBefore.REGION_CLASS)) {
- area.setAbsoluteHeight(-area.getMaxHeight());
- } else if (regionClass.equals(RegionAfter.REGION_CLASS)) {
- area.setAbsoluteHeight(area.getPage().getBody().getMaxHeight());
- }
-
- for (int i = 0; i < numChildren; i++) {
- FObj fo = (FObj)children.elementAt(i);
-
- Status status;
- if ((status = fo.layout(area)).isIncomplete()) {
- // in fact all should be laid out and clip, error etc depending on 'overflow'
- MessageHandler.logln("Warning: Some static content could not fit in the area.");
- this.marker = i;
- if ((i != 0) && (status.getCode() == Status.AREA_FULL_NONE)) {
- status = new Status(Status.AREA_FULL_SOME);
- }
- return (status);
- }
- }
- resetMarker();
- return new Status(Status.OK);
- }
-
- protected String getElementName() {
- return "fo:static-content";
- }
-
- // flowname checking is more stringient for static content currently
- protected void setFlowName(String name) throws FOPException {
- if (name == null || name.equals("")) {
- throw new FOPException("A 'flow-name' is required for "
- + getElementName() + ".");
- } else {
- super.setFlowName(name);
- }
-
- }
-
-}
+++ /dev/null
-/*
- * -- $Id$ --
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.datatypes.*;
-import org.apache.fop.apps.FOPException;
-
-// Java
-import java.util.Vector;
-
-public class Table extends FObj {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new Table(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new Table.Maker();
- }
-
- int breakBefore;
- int breakAfter;
- int spaceBefore;
- int spaceAfter;
- ColorType backgroundColor;
- int width;
- int height;
- String id;
- TableHeader tableHeader = null;
- TableFooter tableFooter = null;
- boolean omitHeaderAtBreak = false;
- boolean omitFooterAtBreak = false;
-
- Vector columns = new Vector();
- int currentColumnNumber = 0;
- int bodyCount = 0;
-
- AreaContainer areaContainer;
-
- public Table(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:table";
- }
-
- public Status layout(Area area) throws FOPException {
- if (this.marker == BREAK_AFTER) {
- return new Status(Status.OK);
- }
-
- if (this.marker == START) {
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Margin Properties-Block
- MarginProps mProps = propMgr.getMarginProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("block-progression-dimension");
- // this.properties.get("border-after-precendence");
- // this.properties.get("border-before-precedence");
- // this.properties.get("border-collapse");
- // this.properties.get("border-end-precendence");
- // this.properties.get("border-separation");
- // this.properties.get("border-start-precendence");
- // this.properties.get("break-after");
- // this.properties.get("break-before");
- // this.properties.get("id");
- // this.properties.get("inline-progression-dimension");
- // this.properties.get("height");
- // this.properties.get("keep-together");
- // this.properties.get("keep-with-next");
- // this.properties.get("keep-with-previous");
- // this.properties.get("table-layout");
- // this.properties.get("table-omit-footer-at-break");
- // this.properties.get("table-omit-header-at-break");
- // this.properties.get("width");
- // this.properties.get("writing-mode");
-
- this.breakBefore = this.properties.get("break-before").getEnum();
- this.breakAfter = this.properties.get("break-after").getEnum();
- this.spaceBefore =
- this.properties.get("space-before.optimum").getLength().mvalue();
- this.spaceAfter =
- this.properties.get("space-after.optimum").getLength().mvalue();
- this.backgroundColor =
- this.properties.get("background-color").getColorType();
- this.width = this.properties.get("width").getLength().mvalue();
- this.height = this.properties.get("height").getLength().mvalue();
-
- this.id = this.properties.get("id").getString();
-
- this.omitHeaderAtBreak =
- this.properties.get("table-omit-header-at-break").getEnum()
- == TableOmitHeaderAtBreak.TRUE;
- this.omitFooterAtBreak =
- this.properties.get("table-omit-footer-at-break").getEnum()
- == TableOmitFooterAtBreak.TRUE;
-
- if (area instanceof BlockArea) {
- area.end();
- }
- if (this.areaContainer
- == null) { // check if anything was previously laid out
- 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 ((spaceBefore != 0) && (this.marker == 0)) {
- area.addDisplaySpace(spaceBefore);
- }
-
- if (marker == 0 && areaContainer == null) {
- // configure id
- area.getIDReferences().configureID(id, area);
- }
-
- int spaceLeft = area.spaceLeft();
- this.areaContainer =
- new AreaContainer(propMgr.getFontState(area.getFontInfo()), 0, 0,
- area.getAllocationWidth(), area.spaceLeft(),
- Position.STATIC);
- areaContainer.foCreator = this; // G Seshadri
- areaContainer.setPage(area.getPage());
- areaContainer.setBackgroundColor(backgroundColor);
- areaContainer.setBorderAndPadding(propMgr.getBorderAndPadding());
- areaContainer.start();
-
- areaContainer.setAbsoluteHeight(area.getAbsoluteHeight());
- areaContainer.setIDReferences(area.getIDReferences());
-
- // added by Eric Schaeffer
- currentColumnNumber = 0;
- int offset = 0;
-
- boolean addedHeader = false;
- boolean addedFooter = false;
- int numChildren = this.children.size();
- for (int i = 0; i < numChildren; i++) {
- FONode fo = (FONode)children.elementAt(i);
- if (fo instanceof TableColumn) {
- TableColumn c = (TableColumn)fo;
- c.doSetup(areaContainer);
- int numColumnsRepeated = c.getNumColumnsRepeated();
- // int currentColumnNumber = c.getColumnNumber();
-
- for (int j = 0; j < numColumnsRepeated; j++) {
- currentColumnNumber++;
- if (currentColumnNumber > columns.size()) {
- columns.setSize(currentColumnNumber);
- }
- columns.setElementAt(c, currentColumnNumber - 1);
- c.setColumnOffset(offset);
- c.layout(areaContainer);
- offset += c.getColumnWidth();
- }
- }
- }
- areaContainer.setAllocationWidth(offset);
-
- for (int i = this.marker; i < numChildren; i++) {
- FONode fo = (FONode)children.elementAt(i);
- if (fo instanceof TableHeader) {
- if (columns.size() == 0) {
- MessageHandler.errorln("WARNING: current implementation of tables requires a table-column for each column, indicating column-width");
- return new Status(Status.OK);
- }
- tableHeader = (TableHeader)fo;
- tableHeader.setColumns(columns);
- } else if (fo instanceof TableFooter) {
- if (columns.size() == 0) {
- MessageHandler.errorln("WARNING: current implementation of tables requires a table-column for each column, indicating column-width");
- return new Status(Status.OK);
- }
- tableFooter = (TableFooter)fo;
- tableFooter.setColumns(columns);
- } else if (fo instanceof TableBody) {
- if (columns.size() == 0) {
- MessageHandler.errorln("WARNING: current implementation of tables requires a table-column for each column, indicating column-width");
- return new Status(Status.OK);
- }
- Status status;
- if (tableHeader != null &&!addedHeader) {
- if ((status =
- tableHeader.layout(areaContainer)).isIncomplete()) {
- return new Status(Status.AREA_FULL_NONE);
- }
- addedHeader = true;
- tableHeader.resetMarker();
- area.setMaxHeight(area.getMaxHeight() - spaceLeft
- + this.areaContainer.getMaxHeight());
- }
- if (tableFooter != null &&!this.omitFooterAtBreak
- &&!addedFooter) {
- if ((status =
- tableFooter.layout(areaContainer)).isIncomplete()) {
- return new Status(Status.AREA_FULL_NONE);
- }
- addedFooter = true;
- tableFooter.resetMarker();
- }
- fo.setWidows(widows);
- fo.setOrphans(orphans);
- ((TableBody)fo).setColumns(columns);
-
- if ((status = fo.layout(areaContainer)).isIncomplete()) {
- this.marker = i;
- if (bodyCount == 0
- && status.getCode() == Status.AREA_FULL_NONE) {
- if (tableHeader != null)
- tableHeader.removeLayout(areaContainer);
- if (tableFooter != null)
- tableFooter.removeLayout(areaContainer);
- resetMarker();
- // status = new Status(Status.AREA_FULL_SOME);
- }
- // areaContainer.end();
- if (areaContainer.getContentHeight() > 0) {
- area.addChild(areaContainer);
- area.increaseHeight(areaContainer.getHeight());
- area.setAbsoluteHeight(areaContainer.getAbsoluteHeight());
- if (this.omitHeaderAtBreak) {
- // remove header, no longer needed
- tableHeader = null;
- }
- if (tableFooter != null &&!this.omitFooterAtBreak) {
- // move footer to bottom of area and move up body
- ((TableBody)fo).setYPosition(tableFooter.getYPosition());
- tableFooter.setYPosition(tableFooter.getYPosition()
- + ((TableBody)fo).getHeight());
- }
- setupColumnHeights();
- status = new Status(Status.AREA_FULL_SOME);
- }
- return status;
- } else {
- bodyCount++;
- }
- area.setMaxHeight(area.getMaxHeight() - spaceLeft
- + this.areaContainer.getMaxHeight());
- if (tableFooter != null &&!this.omitFooterAtBreak) {
- // move footer to bottom of area and move up body
- // space before and after footer will make this wrong
- ((TableBody)fo).setYPosition(tableFooter.getYPosition());
- tableFooter.setYPosition(tableFooter.getYPosition()
- + ((TableBody)fo).getHeight());
- }
- }
- }
-
- if (tableFooter != null && this.omitFooterAtBreak) {
- if (tableFooter.layout(areaContainer).isIncomplete()) {
- // this is a problem since we need to remove a row
- // from the last table body and place it on the
- // next page so that it can have a footer at
- // the end of the table.
- MessageHandler.errorln("WARNING: footer could not fit on page, moving last body row to next page");
- area.addChild(areaContainer);
- area.increaseHeight(areaContainer.getHeight());
- area.setAbsoluteHeight(areaContainer.getAbsoluteHeight());
- if (this.omitHeaderAtBreak) {
- // remove header, no longer needed
- tableHeader = null;
- }
- tableFooter.removeLayout(areaContainer);
- tableFooter.resetMarker();
- return new Status(Status.AREA_FULL_SOME);
- }
- }
-
- if (height != 0)
- areaContainer.setHeight(height);
-
- setupColumnHeights();
-
- areaContainer.end();
- area.addChild(areaContainer);
-
- /* should this be combined into above? */
- area.increaseHeight(areaContainer.getHeight());
-
- area.setAbsoluteHeight(areaContainer.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);
- }
-
- return new Status(Status.OK);
- }
-
- protected void setupColumnHeights() {
- int numChildren = this.children.size();
- for (int i = 0; i < numChildren; i++) {
- FONode fo = (FONode)children.elementAt(i);
- if (fo instanceof TableColumn) {
- ((TableColumn)fo).setHeight(areaContainer.getContentHeight());
- }
- }
- }
-
- public int getAreaHeight() {
- return areaContainer.getHeight();
- }
-
- /**
- * Return the content width of the boxes generated by this table FO.
- */
- public int getContentWidth() {
- if (areaContainer != null)
- return areaContainer.getContentWidth(); // getAllocationWidth()??
- else
- return 0; // not laid out yet
- }
-
- // /**
- // * Return the last TableRow in the header or null if no header or
- // * no header in non-first areas.
- // * @param bForInitialArea If true, return the header row for the
- // * initial table area, else for a continuation area, taking into
- // * account the omit-header-at-break property.
- // */
- // TableRow getLastHeaderRow(boolean bForInitialArea) {
- // // Check omit...
- // if ((tableHeader != null) &&
- // (bForInitialArea || omitHeaderAtBreak == false)) {
- // return tableHeader.children.lastElement();
- // }
- // return null;
- // }
-
- // /**
- // * Return the first TableRow in the footer or null if no footer or
- // * no footer in non-last areas.
- // * @param bForFinalArea If true, return the footer row for the
- // * final table area, else for a non-final area, taking into
- // * account the omit-footer-at-break property.
- // */
- // TableRow getLastFooterRow(boolean bForFinalArea) {
- // if ((tableFooter != null) &&
- // (bForFinalArea || omitFooterAtBreak == false)) {
- // return tableFooter.children.firstElement();
- // }
- // return null;
- // }
-
-
- // /**
- // * Return border information for the side (start/end) of the column
- // * whose number is iColNumber (first column = 1).
- // * ATTENTION: for now we assume columns are in order in the array!
- // */
- // BorderInfo getColumnBorder(BorderInfo.Side side, int iColNumber) {
- // TableColumn col = (TableColumn)columns.elementAt(iColNumber);
- // return col.getBorderInfo(side);
- // }
-}
+++ /dev/null
-/*
- * -- $Id$ --
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.flow.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-
-/**
- */
-public class TableAndCaption extends ToBeImplementedElement {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new TableAndCaption(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new TableAndCaption.Maker();
- }
-
- protected TableAndCaption(FObj parent,
- PropertyList propertyList) throws FOPException {
- super(parent, propertyList);
- this.name = "fo:table-and-caption";
- }
-
- public Status layout(Area area) throws FOPException {
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Margin Properties-Block
- MarginProps mProps = propMgr.getMarginProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("caption-side");
- // this.properties.get("id");
- // this.properties.get("keep-together");
- // this.properties.get("keep-with-next");
- // this.properties.get("keep-with-previous");
-
- return super.layout(area);
- }
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.datatypes.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-
-// Java
-import java.util.Vector;
-import java.util.Enumeration;
-
-public class TableBody extends FObj {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new TableBody(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new TableBody.Maker();
- }
-
- int spaceBefore;
- int spaceAfter;
- ColorType backgroundColor;
- String id;
-
- Vector columns;
- RowSpanMgr rowSpanMgr; // manage information about spanning rows
-
- AreaContainer areaContainer;
-
- public TableBody(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:table-body";
- }
-
- public void setColumns(Vector columns) {
- this.columns = columns;
- }
-
- public void setYPosition(int value) {
- areaContainer.setYPosition(value);
- }
-
- public int getYPosition() {
- return areaContainer.getCurrentYPosition();
- }
-
- public int getHeight() {
- return areaContainer.getHeight() + spaceBefore + spaceAfter;
- }
-
- public Status layout(Area area) throws FOPException {
- if (this.marker == BREAK_AFTER) {
- return new Status(Status.OK);
- }
-
- if (this.marker == START) {
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("id");
-
- this.spaceBefore =
- this.properties.get("space-before.optimum").getLength().mvalue();
- this.spaceAfter =
- this.properties.get("space-after.optimum").getLength().mvalue();
- this.backgroundColor =
- this.properties.get("background-color").getColorType();
- this.id = this.properties.get("id").getString();
-
- area.getIDReferences().createID(id);
-
- if (area instanceof BlockArea) {
- area.end();
- }
-
- if (rowSpanMgr == null) {
- rowSpanMgr = new RowSpanMgr(columns.size());
- }
-
- // if (this.isInListBody) {
- // startIndent += bodyIndent + distanceBetweenStarts;
- // }
-
- this.marker = 0;
-
- }
-
- if ((spaceBefore != 0) && (this.marker == 0)) {
- area.increaseHeight(spaceBefore);
- }
-
- if (marker == 0) {
- // configure id
- area.getIDReferences().configureID(id, area);
- }
-
- int spaceLeft = area.spaceLeft();
-
- /*
- * Note: the parent FO must be a Table. The parent Area is the Block
- * type area created by the Table, which is also a reference area.
- * The content "width" (IPD) of the TableBody is the same as that
- * of the containing table area, and its relative position is 0,0.
- * Strictly speaking (CR), this FO should generate no areas!
- */
- this.areaContainer =
- new AreaContainer(propMgr.getFontState(area.getFontInfo()), 0,
- area.getContentHeight(),
- area.getContentWidth(), // IPD
- area.spaceLeft(), Position.RELATIVE);
- areaContainer.foCreator = this; // G Seshadri
- areaContainer.setPage(area.getPage());
- areaContainer.setBackgroundColor(backgroundColor);
- areaContainer.setBorderAndPadding(propMgr.getBorderAndPadding());
- areaContainer.start();
-
- areaContainer.setAbsoluteHeight(area.getAbsoluteHeight());
- areaContainer.setIDReferences(area.getIDReferences());
-
- Vector keepWith = new Vector();
- int numChildren = this.children.size();
- TableRow lastRow = null;
- boolean endKeepGroup = true;
- for (int i = this.marker; i < numChildren; i++) {
- Object child = children.elementAt(i);
- if (!(child instanceof TableRow)) {
- throw new FOPException("Currently only Table Rows are supported in table body, header and footer");
- }
- TableRow row = (TableRow)child;
-
- row.setRowSpanMgr(rowSpanMgr);
- row.setColumns(columns);
- row.doSetup(areaContainer);
- if (row.getKeepWithPrevious().getType()
- != KeepValue.KEEP_WITH_AUTO && lastRow != null
- && keepWith.indexOf(lastRow)
- == -1) {
- keepWith.addElement(lastRow);
- } else {
- if (endKeepGroup && keepWith.size() > 0) {
- keepWith = new Vector();
- }
- }
-
- Status status;
- if ((status = row.layout(areaContainer)).isIncomplete()) {
- // BUG!!! don't distinguish between break-before and after!
- if (status.isPageBreak()) {
- this.marker = i;
- area.addChild(areaContainer);
- // areaContainer.end();
-
- area.increaseHeight(areaContainer.getHeight());
- area.setAbsoluteHeight(areaContainer.getAbsoluteHeight());
- if (i == numChildren - 1) {
- this.marker = BREAK_AFTER;
- if (spaceAfter != 0) {
- area.increaseHeight(spaceAfter);
- }
- }
- return status;
- }
- if (keepWith.size()
- > 0) { // && status.getCode() == Status.AREA_FULL_NONE
- // FIXME!!! Handle rows spans!!!
- row.removeLayout(areaContainer);
- for (Enumeration e = keepWith.elements();
- e.hasMoreElements(); ) {
- TableRow tr = (TableRow)e.nextElement();
- tr.removeLayout(areaContainer);
- i--;
- }
- if (i == 0) {
- resetMarker();
- return new Status(Status.AREA_FULL_NONE);
- }
- }
- this.marker = i;
- if ((i != 0) && (status.getCode() == Status.AREA_FULL_NONE)) {
- status = new Status(Status.AREA_FULL_SOME);
- }
- if (!((i == 0) && (areaContainer.getContentHeight() <= 0))) {
- area.addChild(areaContainer);
- // areaContainer.end();
-
- area.increaseHeight(areaContainer.getHeight());
- area.setAbsoluteHeight(areaContainer.getAbsoluteHeight());
- }
- return status;
- } else if (status.getCode() == Status.KEEP_WITH_NEXT
- || rowSpanMgr.hasUnfinishedSpans()) {
- keepWith.addElement(row);
- endKeepGroup = false;
- } else {
- endKeepGroup = true;
- }
- lastRow = row;
- area.setMaxHeight(area.getMaxHeight() - spaceLeft
- + this.areaContainer.getMaxHeight());
- spaceLeft = area.spaceLeft();
- }
- area.addChild(areaContainer);
- areaContainer.end();
-
- area.increaseHeight(areaContainer.getHeight());
-
- area.setAbsoluteHeight(areaContainer.getAbsoluteHeight());
-
- if (spaceAfter != 0) {
- area.increaseHeight(spaceAfter);
- area.setMaxHeight(area.getMaxHeight() - spaceAfter);
- }
-
- if (area instanceof BlockArea) {
- area.start();
- }
-
- return new Status(Status.OK);
- }
-
- public void removeLayout(Area area) {
- if (areaContainer != null) {
- area.removeChild(areaContainer);
- }
- if (spaceBefore != 0) {
- area.increaseHeight(-spaceBefore);
- }
- if (spaceAfter != 0) {
- area.increaseHeight(-spaceAfter);
- }
- this.resetMarker();
- this.removeID(area.getIDReferences());
- }
-
-}
+++ /dev/null
-/*
- * -- $Id$ --
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.flow.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-
-/**
- */
-public class TableCaption extends ToBeImplementedElement {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new TableCaption(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new TableCaption.Maker();
- }
-
- protected TableCaption(FObj parent,
- PropertyList propertyList) throws FOPException {
- super(parent, propertyList);
- this.name = "fo:table-caption";
- }
-
- public Status layout(Area area) throws FOPException {
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("block-progression-dimension");
- // this.properties.get("height");
- // this.properties.get("id");
- // this.properties.get("inline-progression-dimension");
- // this.properties.get("keep-togethe");
- // this.properties.get("width");
-
- return super.layout(area);
- }
-}
+++ /dev/null
-/*
- * -- $Id$ --
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-import org.apache.fop.datatypes.*;
-
-public class TableCell extends FObj {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new TableCell(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new TableCell.Maker();
- }
-
- // int spaceBefore;
- // int spaceAfter;
- ColorType backgroundColor;
-
- String id;
- int numColumnsSpanned;
- int numRowsSpanned;
- int iColNumber = -1; // uninitialized
-
- /**
- * Offset of content rectangle in inline-progression-direction,
- * relative to table.
- */
- protected int startOffset;
-
- /**
- * Dimension of allocation rectangle in inline-progression-direction,
- * determined by the width of the column(s) occupied by the cell
- */
- protected int width;
-
- /**
- * Offset of content rectangle, in block-progression-direction,
- * relative to the row.
- */
- protected int beforeOffset = 0;
-
- /**
- * Offset of content rectangle, in inline-progression-direction,
- * relative to the column start edge.
- */
- protected int startAdjust = 0;
-
- /**
- * Adjust to theoretical column width to obtain content width
- * relative to the column start edge.
- */
- protected int widthAdjust = 0;
-
- /* For collapsed border style */
- protected int borderHeight = 0;
-
- /**
- * Minimum ontent height of cell.
- */
- protected int minCellHeight = 0;
-
- protected int height = 0;
- protected int top; // Ypos of cell ???
- protected int verticalAlign;
- protected boolean bRelativeAlign = false;
-
- // boolean setup = false;
- boolean bSepBorders = true;
-
- /**
- * Border separation value in the block-progression dimension.
- * Used in calculating cells height.
- */
- int m_borderSeparation = 0;
-
- AreaContainer cellArea;
-
- public TableCell(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:table-cell";
- doSetup(); // init some basic property values
- }
-
- // Set position relative to table (set by body?)
- public void setStartOffset(int offset) {
- startOffset = offset;
- }
-
- // Initially same as the column width containg this cell or the
- // sum of the spanned columns if numColumnsSpanned > 1
- public void setWidth(int width) {
- this.width = width;
- }
-
- public int getColumnNumber() {
- return iColNumber;
- }
-
- public int getNumColumnsSpanned() {
- return numColumnsSpanned;
- }
-
- public int getNumRowsSpanned() {
- return numRowsSpanned;
- }
-
- public void doSetup() // throws FOPException
- {
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("border-after-precedence");
- // this.properties.get("border-before-precendence");
- // this.properties.get("border-end-precendence");
- // this.properties.get("border-start-precendence");
- // this.properties.get("block-progression-dimension");
- // this.properties.get("column-number");
- // this.properties.get("display-align");
- // this.properties.get("relative-align");
- // this.properties.get("empty-cells");
- // this.properties.get("ends-row");
- // this.properties.get("height");
- // this.properties.get("id");
- // this.properties.get("number-columns-spanned");
- // this.properties.get("number-rows-spanned");
- // this.properties.get("starts-row");
- // this.properties.get("width");
-
- this.iColNumber =
- properties.get("column-number").getNumber().intValue();
- if (iColNumber < 0) {
- iColNumber = 0;
- }
- this.numColumnsSpanned =
- this.properties.get("number-columns-spanned").getNumber().intValue();
- if (numColumnsSpanned < 1) {
- numColumnsSpanned = 1;
- }
- this.numRowsSpanned =
- this.properties.get("number-rows-spanned").getNumber().intValue();
- if (numRowsSpanned < 1) {
- numRowsSpanned = 1;
- }
-
- this.backgroundColor =
- this.properties.get("background-color").getColorType();
-
- this.id = this.properties.get("id").getString();
-
- bSepBorders = (this.properties.get("border-collapse").getEnum()
- == BorderCollapse.SEPARATE);
-
- calcBorders(propMgr.getBorderAndPadding());
-
- // Vertical cell alignment
- verticalAlign = this.properties.get("display-align").getEnum();
- if (verticalAlign == DisplayAlign.AUTO) {
- // Depends on all cells starting in row
- bRelativeAlign = true;
- verticalAlign = this.properties.get("relative-align").getEnum();
- } else
- bRelativeAlign = false; // Align on a per-cell basis
-
- this.minCellHeight =
- this.properties.get("height").getLength().mvalue();
- }
-
-
- public Status layout(Area area) throws FOPException {
- int originalAbsoluteHeight = area.getAbsoluteHeight();
- if (this.marker == BREAK_AFTER) {
- return new Status(Status.OK);
- }
-
- if (this.marker == START) {
- // if (!setup) {
- // doSetup(area);
- // }
-
- // Calculate cell borders
- // calcBorders(propMgr.getBorderAndPadding());
-
- area.getIDReferences().createID(id);
-
- this.marker = 0;
- }
-
- /*
- * if ((spaceBefore != 0) && (this.marker ==0)) {
- * area.increaseHeight(spaceBefore);
- * }
- */
-
- if (marker == 0) {
- // configure id
- area.getIDReferences().configureID(id, area);
- }
-
- // int spaceLeft = area.spaceLeft() - m_borderSeparation/2 + borderHeight/2 ;
- int spaceLeft = area.spaceLeft() - m_borderSeparation;
- // The Area position defines the content rectangle! Borders
- // and padding are outside of this rectangle.
- this.cellArea =
- new AreaContainer(propMgr.getFontState(area.getFontInfo()),
- startOffset + startAdjust, beforeOffset,
- width - widthAdjust, spaceLeft,
- Position.RELATIVE);
-
- cellArea.foCreator = this; // G Seshadri
- cellArea.setPage(area.getPage());
- try {
- cellArea.setBorderAndPadding((BorderAndPadding)
- propMgr.getBorderAndPadding().clone());
- } catch (CloneNotSupportedException e) {
- System.err.println("Can't clone BorderAndPadding: " + e) ;
- cellArea.setBorderAndPadding(propMgr.getBorderAndPadding());
- }
- cellArea.setBackgroundColor(this.backgroundColor);
- cellArea.start();
-
- cellArea.setAbsoluteHeight(area.getAbsoluteHeight()); // ???
- cellArea.setIDReferences(area.getIDReferences());
- // ******** CHECK THIS: we've changed startOffset (KL)
- cellArea.setTableCellXOffset(startOffset);
-
- int numChildren = this.children.size();
- for (int i = this.marker; i < numChildren; i++) {
- FObj fo = (FObj)children.elementAt(i);
- fo.setIsInTableCell();
- fo.forceWidth(width); // ???
-
- // Overflows may cause a row to be re-layedout,
- // need to pass already processed content.
- this.marker = i;
-
- Status status;
- if ((status = fo.layout(cellArea)).isIncomplete()) {
- // this.marker = i;
- if ((i == 0) && (status.getCode() == Status.AREA_FULL_NONE)) {
- return new Status(Status.AREA_FULL_NONE);
- } else {
- // hani Elabed 11/21/2000
- area.addChild(cellArea);
- // area.setAbsoluteHeight(cellArea.getAbsoluteHeight());
- return new Status(Status.AREA_FULL_SOME);
- }
- }
-
- area.setMaxHeight(area.getMaxHeight() - spaceLeft
- + this.cellArea.getMaxHeight());
- }
- cellArea.end();
- area.addChild(cellArea);
-
- // Adjust for minimum cell content height
- if (minCellHeight > cellArea.getContentHeight()) {
- cellArea.setHeight(minCellHeight);
- }
-
- // This is the allocation height of the cell (including borders
- // and padding
- // ALSO need to include offsets if using "separate borders"
- height = cellArea.getHeight();
- top = cellArea.getCurrentYPosition(); // CHECK THIS!!!
-
- // reset absoluteHeight to beginning of row
- // area.setHeight(cellArea.getHeight() + spaceBefore + spaceAfter);
- // I don't think we should do this here (KL) !!!
- // area.setHeight(cellArea.getHeight());
- // area.setAbsoluteHeight(originalAbsoluteHeight);
-
- return new Status(Status.OK);
- }
-
- /**
- * Return the allocation height of the cell area.
- * Note: called by TableRow.
- * We adjust the actual allocation height of the area by the value
- * of border separation (for separate borders) or border height
- * adjustment for collapse style (because current scheme makes cell
- * overestimate the allocation height).
- */
- public int getHeight() {
- return cellArea.getHeight() + m_borderSeparation - borderHeight;
- }
-
- /**
- * Set the final size of cell content rectangles to the actual row height
- * and to vertically align the actual content within the cell rectangle.
- * @param h Height of this row in the grid which is based on
- * the allocation height of all the cells in the row, including any
- * border separation values.
- */
- public void setRowHeight(int h) {
- int delta = h - getHeight();
- // cellArea.increaseHeight(h + borderHeight/2 - cellArea.getHeight());
- if (bRelativeAlign) {
- // Must get info for all cells starting in row!
- // verticalAlign can be BEFORE or BASELINE
- // For now just treat like "before"
- cellArea.increaseHeight(delta);
- } else if (delta > 0) {
- BorderAndPadding cellBP = cellArea.getBorderAndPadding();
- switch (verticalAlign) {
- case DisplayAlign.CENTER:
- // Increase cell padding before and after and change
- // "Y" position of content rectangle
- cellArea.shiftYPosition(delta / 2);
- cellBP.setPaddingLength(BorderAndPadding.TOP,
- cellBP.getPaddingTop(false)
- + delta / 2);
- cellBP.setPaddingLength(BorderAndPadding.BOTTOM,
- cellBP.getPaddingBottom(false)
- + delta - delta / 2);
- break;
- case DisplayAlign.AFTER:
- // Increase cell padding before and change
- // "Y" position of content rectangle
- cellBP.setPaddingLength(BorderAndPadding.TOP,
- cellBP.getPaddingTop(false) + delta);
- cellArea.shiftYPosition(delta);
- break;
- case DisplayAlign.BEFORE:
- // cellArea.increaseHeight(delta);
- cellBP.setPaddingLength(BorderAndPadding.BOTTOM,
- cellBP.getPaddingBottom(false)
- + delta);
-
- default: // OK
- break;
- }
- }
- }
-
- /**
- * Calculate cell border and padding, including offset of content
- * rectangle from the theoretical grid position.
- */
- private void calcBorders(BorderAndPadding bp) {
- if (this.bSepBorders) {
- /*
- * Easy case.
- * Cell border is the property specified directly on cell.
- * Offset content rect by half the border-separation value,
- * in addition to the border and padding values. Note:
- * border-separate should only be specified on the table object,
- * but it inherits.
- */
- int iSep =
- properties.get("border-separation.inline-progression-direction").getLength().mvalue();
- this.startAdjust = iSep / 2 + bp.getBorderLeftWidth(false)
- + bp.getPaddingLeft(false);
- /*
- * int contentOffset = iSep + bp.getBorderStartWidth(false) +
- * bp.getPaddingStart(false);
- */
- this.widthAdjust = startAdjust + iSep - iSep / 2
- + bp.getBorderRightWidth(false)
- + bp.getPaddingRight(false);
- // bp.getBorderEndWidth(false) + bp.getPaddingEnd(false);
- // Offset of content rectangle in the block-progression direction
- m_borderSeparation =
- properties.get("border-separation.block-progression-direction").getLength().mvalue();
- this.beforeOffset = m_borderSeparation / 2
- + bp.getBorderTopWidth(false)
- + bp.getPaddingTop(false);
- // bp.getBorderBeforeWidth(false) + bp.getPaddingBefore(false);
-
- } else {
- // System.err.println("Collapse borders");
- /*
- * Hard case.
- * Cell border is combination of other cell borders, or table
- * border for edge cells. Also seems to border values specified
- * on row and column FO in the table (if I read CR correclty.)
- */
-
- // Set up before and after borders, taking into account row
- // and table border properties.
- // ??? What about table-body, header,footer
-
- /*
- * We can't calculate before and after because we aren't sure
- * whether this row will be the first or last in its area, due
- * to redoing break decisions (at least in the "new" architecture.)
- * So in the general case, we will calculate two possible values:
- * the first/last one and the "middle" one.
- * Example: border-before
- * 1. If the cell is in the first row in the first table body, it
- * will combine with the last row of the header, or with the
- * top (before) table border if there is no header.
- * 2. Otherwise there are two cases:
- * a. the row is first in its (non-first) Area.
- * The border can combine with either:
- * i. the last row of table-header and its cells, or
- * ii. the table before border (no table-header or it is
- * omitted on non-first Areas).
- * b. the row isn't first in its Area.
- * The border combines with the border of the previous
- * row and the cells which end in that row.
- */
-
- /*
- * if-first
- * Calculate the effective border of the cell before-border,
- * it's parent row before-border, the last header row after-border,
- * the after border of the cell(s) which end in the last header
- * row.
- */
- /*
- * if-not-first
- * Calculate the effective border of the cell before-border,
- * it's parent row before-border, the previous row after-border,
- * the after border of the cell(s) which end in the previous
- * row.
- */
-
-
- /* ivan demakov */
- int borderStart = bp.getBorderLeftWidth(false);
- int borderEnd = bp.getBorderRightWidth(false);
- int borderBefore = bp.getBorderTopWidth(false);
- int borderAfter = bp.getBorderBottomWidth(false);
-
- this.startAdjust = borderStart / 2 + bp.getPaddingLeft(false);
-
- this.widthAdjust = startAdjust + borderEnd / 2
- + bp.getPaddingRight(false);
- this.beforeOffset = borderBefore / 2 + bp.getPaddingTop(false);
- // Half border height to fix overestimate of area size!
- this.borderHeight = (borderBefore + borderAfter) / 2;
- }
- }
-
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-import org.apache.fop.datatypes.*;
-
-public class TableColumn extends FObj {
-
- ColorType backgroundColor;
-
- int columnWidth;
- int columnOffset;
- int numColumnsRepeated;
-
- boolean setup = false;
-
- AreaContainer areaContainer;
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new TableColumn(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new TableColumn.Maker();
- }
-
- public TableColumn(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:table-column";
- }
-
- public int getColumnWidth() {
- return columnWidth;
- }
-
- public int getColumnNumber() {
- return 0; // not implemented yet
- }
-
- public int getNumColumnsRepeated() {
- return numColumnsRepeated;
- }
-
- public void doSetup(Area area) throws FOPException {
-
- // Common Border, Padding, and Background Properties
- // only background apply, border apply if border-collapse
- // is collapse.
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // this.properties.get("column-number");
- // this.properties.get("column-width");
- // this.properties.get("number-columns-repeated");
- // this.properties.get("number-columns-spanned");
- // this.properties.get("visibility");
-
-
- this.numColumnsRepeated =
- this.properties.get("number-columns-repeated").getNumber().intValue();
-
- this.backgroundColor =
- this.properties.get("background-color").getColorType();
-
- this.columnWidth =
- this.properties.get("column-width").getLength().mvalue();
-
- // initialize id
- String id = this.properties.get("id").getString();
- area.getIDReferences().initializeID(id, area);
-
- setup = true;
- }
-
- public Status layout(Area area) throws FOPException {
- if (this.marker == BREAK_AFTER) {
- return new Status(Status.OK);
- }
-
- if (this.marker == START) {
- if (!setup) {
- doSetup(area);
- }
- }
-
- // KL: don't take table borders into account!
- this.areaContainer =
- new AreaContainer(propMgr.getFontState(area.getFontInfo()),
- columnOffset /* - area.getBorderLeftWidth() */,
- /* -area.getBorderTopWidth() */
- 0, columnWidth, area.getContentHeight(), Position.RELATIVE);
- // area.getHeight(), Position.RELATIVE);
- areaContainer.foCreator = this; // G Seshadri
- areaContainer.setPage(area.getPage());
- areaContainer.setBorderAndPadding(propMgr.getBorderAndPadding());
- areaContainer.setBackgroundColor(this.backgroundColor);
- areaContainer.setHeight(area.getHeight());
- area.addChild(areaContainer);
-
- return new Status(Status.OK);
- }
-
- public void setColumnOffset(int columnOffset) {
- this.columnOffset = columnOffset;
- }
-
- public void setHeight(int height) {
- areaContainer.setMaxHeight(height);
- areaContainer.setHeight(height);
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.datatypes.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-
-// Java
-import java.util.Vector;
-import java.util.Enumeration;
-
-public class TableFooter extends TableBody {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new TableFooter(parent, propertyList);
- }
-
- }
-
- public int getYPosition() {
- return areaContainer.getCurrentYPosition() - spaceBefore;
- }
-
- public void setYPosition(int value) {
- areaContainer.setYPosition(value + 2 * spaceBefore);
- }
-
- public static FObj.Maker maker() {
- return new TableFooter.Maker();
- }
-
- public TableFooter(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:table-footer";
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.datatypes.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-
-// Java
-import java.util.Vector;
-import java.util.Enumeration;
-
-public class TableHeader extends TableBody {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new TableHeader(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new TableHeader.Maker();
- }
-
- public TableHeader(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:table-header";
- }
-
-}
+++ /dev/null
-/*
- * -- $Id$ --
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.messaging.MessageHandler;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.datatypes.*;
-import org.apache.fop.layout.*;
-import org.apache.fop.apps.FOPException;
-
-// Java
-import java.util.Vector;
-import java.util.Enumeration;
-
-public class TableRow extends FObj {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new TableRow(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new TableRow.Maker();
- }
-
- boolean setup = false;
-
- int breakAfter;
- ColorType backgroundColor;
- String id;
-
- KeepValue keepWithNext;
- KeepValue keepWithPrevious;
- KeepValue keepTogether;
-
- int widthOfCellsSoFar = 0;
- int largestCellHeight = 0;
- int minHeight = 0; // force row height
- Vector columns;
-
- AreaContainer areaContainer;
-
- boolean areaAdded = false;
-
- private RowSpanMgr rowSpanMgr = null;
- private CellArray cellArray = null;
-
- private static class CellArray {
- public static final byte EMPTY = 0;
- public static final byte CELLSTART = 1;
- public static final byte CELLSPAN = 2;
-
- private TableCell[] cells;
- private byte[] states;
-
- public CellArray(RowSpanMgr rsi, int numColumns) {
- // Initialize the cell array by marking any cell positions
- // occupied by spans from previous rows
- cells = new TableCell[numColumns];
- states = new byte[numColumns];
- for (int i = 0; i < numColumns; i++) {
- if (rsi.isSpanned(i + 1)) {
- cells[i] = rsi.getSpanningCell(i + 1);
- states[i] = CELLSPAN;
- } else
- states[i] = EMPTY;
- }
- }
-
- /**
- * Return column which doesn't already contain a span or a cell
- * If past the end or no free cells after colNum, return -1
- * Otherwise return value >= input value.
- */
- int getNextFreeCell(int colNum) {
- for (int i = colNum - 1; i < states.length; i++) {
- if (states[i] == EMPTY)
- return i + 1;
- }
- return -1;
- }
-
-
- /**
- * Return type of cell in colNum (1 based)
- */
- int getCellType(int colNum) {
- if (colNum > 0 && colNum <= cells.length) {
- return states[colNum - 1];
- } else
- return -1; // probably should throw exception
- }
-
- /**
- * Return cell in colNum (1 based)
- */
- TableCell getCell(int colNum) {
- if (colNum > 0 && colNum <= cells.length) {
- return cells[colNum - 1];
- } else
- return null; // probably should throw exception
- }
-
- /**
- * Store cell starting at cellColNum (1 based) and spanning numCols
- * If any of the columns is already occupied, return false, else true
- */
- boolean storeCell(TableCell cell, int colNum, int numCols) {
- boolean rslt = true;
- int index = colNum - 1;
- for (int count = 0; index < cells.length && count < numCols;
- count++, index++) {
- if (cells[index] == null) {
- cells[index] = cell;
- states[index] = (count == 0) ? CELLSTART : CELLSPAN;
- } else {
- rslt = false;
- // print a message but continue!!!
- }
- }
- return rslt;
- }
-
- // private class EnumCells implements Enumeration {
- // private int iNextIndex=0;
- // private Object nextCell = null;
- // EnumCells() {
- // findNextCell();
- // }
-
- // private void findNextCell() {
- // for (; iNextIndex < cells.length; iNextIndex++) {
- // if (states[iNextIndex] == CELLSTART) {
- // nextCell = cells[iNextIndex];
- // return;
- // }
- // }
- // nextCell = null;
- // }
-
- // public boolean hasMoreElements() {
- // return (nextCell != null);
- // }
-
- // public Object nextElement() {
- // if (nextCell != null) {
- // Object cell = nextCell;
- // findNextCell();
- // return cell;
- // }
- // else throw new java.util.NoSuchElementException("No more cells");
- // }
- // }
-
- // /**
- // * Return an enumeration over all cells in this row
- // * Return each element in cells whose state is CELLSTART or EMPTY?
- // * Skip spanning elements.
- // */
- // Enumeration getCells() {
- // return new EnumCells();
- // }
- }
-
-
- public TableRow(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- this.name = "fo:table-row";
- }
-
- public void setColumns(Vector columns) {
- this.columns = columns;
- }
-
- public KeepValue getKeepWithPrevious() {
- return keepWithPrevious;
- }
-
- public void doSetup(Area area) throws FOPException {
-
- // Common Accessibility Properties
- AccessibilityProps mAccProps = propMgr.getAccessibilityProps();
-
- // this.properties.get("block-progression-dimension");
-
- // Common Aural Properties
- AuralProps mAurProps = propMgr.getAuralProps();
-
- // Common Border, Padding, and Background Properties
- // only background apply, border apply if border-collapse
- // is collapse.
- BorderAndPadding bap = propMgr.getBorderAndPadding();
- BackgroundProps bProps = propMgr.getBackgroundProps();
-
- // Common Relative Position Properties
- RelativePositionProps mRelProps = propMgr.getRelativePositionProps();
-
- // this.properties.get("break-before");
- // this.properties.get("break-after");
- // this.properties.get("id");
- // this.properties.get("height");
- // this.properties.get("keep-together");
- // this.properties.get("keep-with-next");
- // this.properties.get("keep-with-previous");
-
-
- this.breakAfter = this.properties.get("break-after").getEnum();
- this.backgroundColor =
- this.properties.get("background-color").getColorType();
-
- this.keepTogether = getKeepValue("keep-together.within-column");
- this.keepWithNext = getKeepValue("keep-with-next.within-column");
- this.keepWithPrevious =
- getKeepValue("keep-with-previous.within-column");
-
- this.id = this.properties.get("id").getString();
- this.minHeight = this.properties.get("height").getLength().mvalue();
- setup = true;
- }
-
- private KeepValue getKeepValue(String sPropName) {
- Property p = this.properties.get(sPropName);
- Number n = p.getNumber();
- if (n != null)
- return new KeepValue(KeepValue.KEEP_WITH_VALUE, n.intValue());
- switch (p.getEnum()) {
- case Constants.ALWAYS:
- return new KeepValue(KeepValue.KEEP_WITH_ALWAYS, 0);
- // break;
- case Constants.AUTO:
- default:
- return new KeepValue(KeepValue.KEEP_WITH_AUTO, 0);
- // break;
- }
- }
-
- public Status layout(Area area) throws FOPException {
- boolean configID = false;
-
- if (this.marker == BREAK_AFTER) {
- return new Status(Status.OK);
- }
-
- // Layout the first area for this FO
- if (this.marker == START) {
- if (!setup)
- doSetup(area);
-
- // Only do this once. If the row is "thrown" and we start
- // layout over again, we can skip this.
- if (cellArray == null) {
- initCellArray();
- // check to make sure this row hasn't been partially
- // laid out yet (with an id created already)
- area.getIDReferences().createID(id);
- configID = true;
- }
-
- this.marker = 0;
- int breakStatus = propMgr.checkBreakBefore(area);
- if (breakStatus != Status.OK)
- return new Status(breakStatus);
- }
-
- // if (marker == 0 && configID) {
- if (marker == 0) { // KDL: need to do this if thrown or if split?
- // configure id
- area.getIDReferences().configureID(id, area);
- }
-
- int spaceLeft = area.spaceLeft();
-
- this.areaContainer =
- new AreaContainer(propMgr.getFontState(area.getFontInfo()), 0, 0,
- area.getContentWidth(), spaceLeft,
- Position.RELATIVE);
- areaContainer.foCreator = this; // G Seshadri
- areaContainer.setPage(area.getPage());
-
- areaContainer.setBackgroundColor(backgroundColor);
- areaContainer.start();
-
- areaContainer.setAbsoluteHeight(area.getAbsoluteHeight());
- areaContainer.setIDReferences(area.getIDReferences());
-
- largestCellHeight = minHeight;
-
- // Flag indicaing whether any cell didn't fit in available space
- boolean someCellDidNotLayoutCompletely = false;
-
- /*
- * If it takes multiple calls to completely layout the row,
- * we need to process all of the children (cells)
- * not just those from the marker so that the borders
- * will be drawn properly.
- */
- int offset = 0; // Offset of each cell from table start edge
- int iColIndex = 0; // 1-based column index
- Enumeration eCols = columns.elements();
- /*
- * Ideas: set offset on each column when they are initialized
- * no need to calculate for each row.
- * Pass column object to cell to get offset and width and border
- * info if borders are "collapsed".
- */
-
- while (eCols.hasMoreElements()) {
- TableCell cell;
- ++iColIndex;
- TableColumn tcol = (TableColumn)eCols.nextElement();
- int colWidth = tcol.getColumnWidth();
- if (cellArray.getCellType(iColIndex) == CellArray.CELLSTART) {
- cell = cellArray.getCell(iColIndex);
- } else {
- /*
- * If this cell is spanned from a previous row,
- * and this is the last row, get the remaining height
- * and use it to increase maxCellHeight if necessary
- */
- if (rowSpanMgr.isInLastRow(iColIndex)) {
- int h = rowSpanMgr.getRemainingHeight(iColIndex);
- if (h > largestCellHeight)
- largestCellHeight = h;
- }
- offset += colWidth;
- continue;
- }
- // cell.setTableColumn(tcol);
- cell.setStartOffset(offset);
- offset += colWidth;
-
-
- int rowSpan = cell.getNumRowsSpanned();
- Status status;
- if ((status = cell.layout(areaContainer)).isIncomplete()) {
- if ((keepTogether.getType() == KeepValue.KEEP_WITH_ALWAYS)
- || (status.getCode() == Status.AREA_FULL_NONE)
- || rowSpan > 1) {
- // We will put this row into the next column/page
- // Note: the only time this shouldn't be honored is
- // if this row is at the top of the column area.
- // Remove spanning cells from RowSpanMgr?
- this.resetMarker();
- this.removeID(area.getIDReferences());
- return new Status(Status.AREA_FULL_NONE);
- } else if (status.getCode() == Status.AREA_FULL_SOME) {
- /*
- * Row is not keep-together, cell isn't spanning
- * and part of it fits. We can break the cell and
- * the row.
- */
- someCellDidNotLayoutCompletely = true;
- }
- } // else {
- // layout was complete for a particular cell
- int h = cell.getHeight(); // allocation height of cell
- if (rowSpan > 1) { // pass cell fo or area???
- rowSpanMgr.addRowSpan(cell, iColIndex,
- cell.getNumColumnsSpanned(), h,
- rowSpan);
- } else if (h > largestCellHeight) {
- largestCellHeight = h;
- }
- // }
- } // end of loop over all columns/cells
-
- // This is in case a float was composed in the cells
- area.setMaxHeight(area.getMaxHeight() - spaceLeft
- + this.areaContainer.getMaxHeight());
-
- // Only do this for "STARTCELL", ending spans are handled separately
- // What about empty cells? Yes, we should set their height too!
- for (int iCol = 1; iCol <= columns.size(); iCol++) {
- if (cellArray.getCellType(iCol) == CellArray.CELLSTART
- && rowSpanMgr.isSpanned(iCol) == false) {
- cellArray.getCell(iCol).setRowHeight(largestCellHeight);
- }
- }
-
- // Adjust spanning row information
- // ??? what if some cells are broken???
- rowSpanMgr.finishRow(largestCellHeight);
-
- area.addChild(areaContainer);
- areaContainer.setHeight(largestCellHeight);
- areaAdded = true;
- areaContainer.end();
-
- /*
- * The method addDisplaySpace increases both the content
- * height of the parent area (table body, head or footer) and
- * also its "absolute height". So we don't need to do this
- * explicitly.
- *
- * Note: it doesn't look from the CR as though we should take
- * into account borders and padding on rows, only background.
- * The exception is perhaps if the borders are "collapsed", but
- * they should still be rendered only on cells and not on the
- * rows themselves. (Karen Lease - 01may2001)
- */
- area.addDisplaySpace(largestCellHeight
- + areaContainer.getPaddingTop()
- + areaContainer.getBorderTopWidth()
- + areaContainer.getPaddingBottom()
- + areaContainer.getBorderBottomWidth());
-
-
- // replaced by Hani Elabed 11/27/2000
- // return new Status(Status.OK);
-
- if (someCellDidNotLayoutCompletely) {
- return new Status(Status.AREA_FULL_SOME);
- } else {
- if (rowSpanMgr.hasUnfinishedSpans()) {
- // Ignore break after if row span!
- return new Status(Status.KEEP_WITH_NEXT);
- }
- 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.getType() != KeepValue.KEEP_WITH_AUTO) {
- return new Status(Status.KEEP_WITH_NEXT);
- }
- return new Status(Status.OK);
- }
-
- }
-
- public int getAreaHeight() {
- return areaContainer.getHeight();
- }
-
- public void removeLayout(Area area) {
- if (areaAdded)
- area.removeChild(areaContainer);
- areaAdded = false;
- this.resetMarker();
- this.removeID(area.getIDReferences());
- }
-
- public void resetMarker() {
- super.resetMarker();
- // Just reset all the states to not laid out and fix up row spans
- }
-
- /**
- * Called by parent FO to initialize information about
- * cells started in previous rows which span into this row.
- * The layout operation modifies rowSpanMgr
- */
- public void setRowSpanMgr(RowSpanMgr rowSpanMgr) {
- this.rowSpanMgr = rowSpanMgr;
- }
-
- /**
- * Before starting layout for the first time, initialize information
- * about spanning rows, empty cells and spanning columns.
- */
- private void initCellArray() {
- cellArray = new CellArray(rowSpanMgr, columns.size());
- int colNum = 1;
- Enumeration eCells = children.elements();
- while (eCells.hasMoreElements()) {
- colNum = cellArray.getNextFreeCell(colNum);
- // If off the end, the rest of the cells had better be
- // explicitly positioned!!! (returns -1)
-
- TableCell cell = (TableCell)eCells.nextElement();
- int numCols = cell.getNumColumnsSpanned();
- int numRows = cell.getNumRowsSpanned();
- int cellColNum = cell.getColumnNumber();
-
- if (cellColNum == 0) {
- // Not explicitly specified, so put in next available colummn
- // cell.setColumnNumber(colNum);
- // If cellColNum "off the end", this cell is in limbo!
- if (colNum < 1) {
- // ERROR!!!
- continue;
- } else
- cellColNum = colNum;
- } else if (cellColNum > columns.size()) {
- // Explicit specification out of range!
- // Skip it and print an ERROR MESSAGE
- continue;
- }
- // see if it fits and doesn't overwrite anything
- if (cellColNum + numCols - 1 > columns.size()) {
- // MESSAGE: TOO MANY COLUMNS SPANNED!
- numCols = columns.size() - cellColNum + 1;
- }
- // Check for overwriting other cells (returns false)
- if (cellArray.storeCell(cell, cellColNum, numCols) == false) {
- // Print out some kind of warning message.
- }
- if (cellColNum > colNum) {
- // Cells are initialized as empty already
- colNum = cellColNum;
- } else if (cellColNum < colNum) {
- // MESSAGE ? cells out of order?
- colNum = cellColNum; // CR "to the letter"!
- }
- int cellWidth = getCellWidth(cellColNum, numCols);
- cell.setWidth(cellWidth);
- colNum += numCols; // next cell in this column
- }
- }
-
- // ATTENTION if startCol + numCols > number of columns in table!
- private int getCellWidth(int startCol, int numCols) {
- int width = 0;
- for (int count = 0; count < numCols; count++) {
- width += ((TableColumn)columns.elementAt(startCol + count
- - 1)).getColumnWidth();
- }
- return width;
- }
-
-}
+++ /dev/null
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fo.flow;
-
-// FOP
-import org.apache.fop.fo.*;
-import org.apache.fop.apps.FOPException;
-import org.apache.fop.fo.properties.*;
-import org.apache.fop.layout.*;
-
-/**
- * Implementation for fo:wrapper formatting object.
- * The wrapper object serves as
- * a property holder for it's children objects.
- *
- * Content: (#PCDATA|%inline;|%block;)*
- * Properties: id
- */
-public class Wrapper extends FObjMixed {
-
- public static class Maker extends FObj.Maker {
- public FObj make(FObj parent,
- PropertyList propertyList) throws FOPException {
- return new Wrapper(parent, propertyList);
- }
-
- }
-
- public static FObj.Maker maker() {
- return new Wrapper.Maker();
- }
-
- public Wrapper(FObj parent, PropertyList propertyList) {
- super(parent, propertyList);
- // check that this occurs inside an fo:flow
- }
-
- protected void addCharacters(char data[], int start, int length) {
- FOText ft = new FOText(data, start, length, this);
- children.addElement(ft);
- }
-
-}