blob: 71671dd74c6ee148b15d30046759d7fe79489ca9 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* $Id$ */
package org.apache.fop.fo;
// Java
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;
import org.xml.sax.SAXException;
// Apache
import org.apache.commons.logging.Log;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.fo.flow.BasicLink;
import org.apache.fop.fo.flow.Block;
import org.apache.fop.fo.flow.BlockContainer;
import org.apache.fop.fo.flow.Character;
import org.apache.fop.fo.flow.ExternalGraphic;
import org.apache.fop.fo.flow.Footnote;
import org.apache.fop.fo.flow.FootnoteBody;
import org.apache.fop.fo.flow.Inline;
import org.apache.fop.fo.flow.InstreamForeignObject;
import org.apache.fop.fo.flow.Leader;
import org.apache.fop.fo.flow.ListBlock;
import org.apache.fop.fo.flow.ListItem;
import org.apache.fop.fo.flow.PageNumber;
import org.apache.fop.fo.flow.Table;
import org.apache.fop.fo.flow.TableBody;
import org.apache.fop.fo.flow.TableCell;
import org.apache.fop.fo.flow.TableColumn;
import org.apache.fop.fo.flow.TableRow;
import org.apache.fop.fo.pagination.Flow;
import org.apache.fop.fo.pagination.PageSequence;
// FOrayFont
import org.axsl.fontR.FontConsumer;
import org.axsl.fontR.FontException;
import org.axsl.fontR.FontServer;
import org.foray.font.FOrayFontServer;
/**
* Abstract class defining what should be done with SAX events that map to
* XSL-FO input. The events are actually captured by fo/FOTreeBuilder, passed
* to the various fo Objects, which in turn, if needed, pass them to an instance
* of FOEventHandler.
*
* Sub-classes will generally fall into one of two categories:
* 1) a handler that actually builds an FO Tree from the events, or 2) a
* handler that builds a structured (as opposed to formatted) document, such
* as our MIF and RTF output targets.
*/
public abstract class FOEventHandler {
/**
* The FOUserAgent for this process
*/
protected FOUserAgent foUserAgent;
/**
* The current set of id's in the FO tree.
* This is used so we know if the FO tree contains duplicates.
*/
private Set idReferences = new HashSet();
/**
* The property list maker.
*/
protected PropertyListMaker propertyListMaker;
/**
* Font server used to provide all needed font informations.
*/
protected static FontServer fontServer; // TODO vh static?
// private boolean useFreeStandingFonts;
// private boolean useSystemFonts;
// private boolean preferFreeStandingFonts;
/**
* @inheritDoc
*/
public static FontServer getFontServer() {
return fontServer;
}
protected FontConsumer fontConsumer;
// /**
// * @inheritDoc
// */
// public boolean preferFreeStandingFonts() {
// return preferFreeStandingFonts;
// }
//
// /**
// * @inheritDoc
// */
// public PseudoLogger getPseudoLogger() {
// return pseudoLogger;
// }
//
// /**
// * @inheritDoc
// */
// public boolean isUsingFreeStandingFonts() {
// return useFreeStandingFonts;
// }
//
// /**
// * @inheritDoc
// */
// public boolean isUsingSystemFonts() {
// return useSystemFonts;
// }
/**
* Retrieve the font consumer for this document
* @return the FontConsumer instance for this document
*/
public FontConsumer getFontConsumer() {
return fontConsumer;
}
public FOEventHandler(FOUserAgent foUserAgent, String outputFormat, Log log) {
this(foUserAgent);
// pseudoLogger = new CommonsLogger(log);
// if (outputFormat.equals(MimeConstants.MIME_PDF)
// || outputFormat.equals(MimeConstants.MIME_POSTSCRIPT)) {
// useFreeStandingFonts = true;
// useSystemFonts = false;
// preferFreeStandingFonts = true;
// } else {
// useFreeStandingFonts = false;
// useSystemFonts = true;
// preferFreeStandingFonts = false;
// }
if (fontServer == null) {
try {
fontServer = new FOrayFontServer(log);
/* TODO vh: plug font config file */
// ((FOrayFontServer) fontServer).setBaseFontURL(new java.net.URL("file:///local/home/vhennebert/Fop/Tests/Config/axsl-font-conf.xml"));
final String AXSL_FONT_FILE = "/tmp/foray-links/axsl-temp-stuff/axsl-font-conf.xml";
if(!new java.io.File(AXSL_FONT_FILE).canRead()) {
throw new Error("Missing aXSL config file:" + AXSL_FONT_FILE);
}
final URL url = new URL("file://" + AXSL_FONT_FILE);
((FOrayFontServer) fontServer).setup(url/*foUserAgent.getFontCfgURL()*/, null);
} catch (MalformedURLException e) { // Should not happen
log.error("MalformedURLException",e);
} catch (FontException e) {
log.error("Unable to setup the font server",e);
}
}
fontConsumer = fontServer.makeFontConsumer();
/* TODO vh: will have to release */
// fontServer.registerFontConsumer(this);
}
/**
* The XMLWhitespaceHandler for this tree
*/
protected XMLWhiteSpaceHandler whiteSpaceHandler = new XMLWhiteSpaceHandler();
/**
* Indicates whether processing descendants of a marker
*/
private boolean inMarker = false;
/**
* Main constructor
* @param foUserAgent the apps.FOUserAgent instance for this process
*/
public FOEventHandler(FOUserAgent foUserAgent) {
this.foUserAgent = foUserAgent;
}
/**
* Retuns the set of ID references.
* @return the ID references
*/
public Set getIDReferences() {
return idReferences;
}
/**
* Returns the User Agent object associated with this FOEventHandler.
* @return the User Agent object
*/
public FOUserAgent getUserAgent() {
return foUserAgent;
}
/**
* Return the propertyListMaker.
*/
public PropertyListMaker getPropertyListMaker() {
return propertyListMaker;
}
/**
* Set a new propertyListMaker.
*/
public void setPropertyListMaker(PropertyListMaker propertyListMaker) {
this.propertyListMaker = propertyListMaker;
}
/**
* Return the XMLWhiteSpaceHandler
* @return the whiteSpaceHandler
*/
public XMLWhiteSpaceHandler getXMLWhiteSpaceHandler() {
return whiteSpaceHandler;
}
/**
* Switch to or from marker context
* (used by FOTreeBuilder when processing
* a marker)
*
*/
protected void switchMarkerContext(boolean inMarker) {
this.inMarker = inMarker;
}
/**
* Check whether in marker context
*/
protected boolean inMarker() {
return this.inMarker;
}
/**
* This method is called to indicate the start of a new document run.
* @throws SAXException In case of a problem
*/
public void startDocument() throws SAXException {
}
/**
* This method is called to indicate the end of a document run.
* @throws SAXException In case of a problem
*/
public void endDocument() throws SAXException {
}
/**
*
* @param pageSeq PageSequence that is starting.
*/
public void startPageSequence(PageSequence pageSeq) {
}
/**
* @param pageSeq PageSequence that is ending.
*/
public void endPageSequence(PageSequence pageSeq) {
}
/**
*
* @param pagenum PageNumber that is starting.
*/
public void startPageNumber(PageNumber pagenum) {
}
/**
*
* @param pagenum PageNumber that is ending.
*/
public void endPageNumber(PageNumber pagenum) {
}
/**
* This method is called to indicate the start of a new fo:flow
* or fo:static-content.
* This method also handles fo:static-content tags, because the
* StaticContent class is derived from the Flow class.
*
* @param fl Flow that is starting.
*/
public void startFlow(Flow fl) {
}
/**
*
* @param fl Flow that is ending.
*/
public void endFlow(Flow fl) {
}
/**
*
* @param bl Block that is starting.
*/
public void startBlock(Block bl) {
}
/**
*
* @param bl Block that is ending.
*/
public void endBlock(Block bl) {
}
/**
*
* @param blc BlockContainer that is starting.
*/
public void startBlockContainer(BlockContainer blc) {
}
/**
*
* @param blc BlockContainer that is ending.
*/
public void endBlockContainer(BlockContainer blc) {
}
/**
*
* @param inl Inline that is starting.
*/
public void startInline(Inline inl) {
}
/**
*
* @param inl Inline that is ending.
*/
public void endInline(Inline inl) {
}
// Tables
/**
*
* @param tbl Table that is starting.
*/
public void startTable(Table tbl) {
}
/**
*
* @param tbl Table that is ending.
*/
public void endTable(Table tbl) {
}
/**
*
* @param tc TableColumn that is starting;
*/
public void startColumn(TableColumn tc) {
}
/**
*
* @param tc TableColumn that is ending;
*/
public void endColumn(TableColumn tc) {
}
/**
*
* @param th TableBody that is starting;
*/
public void startHeader(TableBody th) {
}
/**
*
* @param th TableBody that is ending.
*/
public void endHeader(TableBody th) {
}
/**
*
* @param tf TableFooter that is starting.
*/
public void startFooter(TableBody tf) {
}
/**
*
* @param tf TableFooter that is ending.
*/
public void endFooter(TableBody tf) {
}
/**
*
* @param tb TableBody that is starting.
*/
public void startBody(TableBody tb) {
}
/**
*
* @param tb TableBody that is ending.
*/
public void endBody(TableBody tb) {
}
/**
*
* @param tr TableRow that is starting.
*/
public void startRow(TableRow tr) {
}
/**
*
* @param tr TableRow that is ending.
*/
public void endRow(TableRow tr) {
}
/**
*
* @param tc TableCell that is starting.
*/
public void startCell(TableCell tc) {
}
/**
*
* @param tc TableCell that is ending.
*/
public void endCell(TableCell tc) {
}
// Lists
/**
*
* @param lb ListBlock that is starting.
*/
public void startList(ListBlock lb) {
}
/**
*
* @param lb ListBlock that is ending.
*/
public void endList(ListBlock lb) {
}
/**
*
* @param li ListItem that is starting.
*/
public void startListItem(ListItem li) {
}
/**
*
* @param li ListItem that is ending.
*/
public void endListItem(ListItem li) {
}
/**
* Process start of a ListLabel.
*/
public void startListLabel() {
}
/**
* Process end of a ListLabel.
*/
public void endListLabel() {
}
/**
* Process start of a ListBody.
*/
public void startListBody() {
}
/**
* Process end of a ListBody.
*/
public void endListBody() {
}
// Static Regions
/**
* Process start of a Static.
*/
public void startStatic() {
}
/**
* Process end of a Static.
*/
public void endStatic() {
}
/**
* Process start of a Markup.
*/
public void startMarkup() {
}
/**
* Process end of a Markup.
*/
public void endMarkup() {
}
/**
* Process start of a Link.
* @param basicLink BasicLink that is ending
*/
public void startLink(BasicLink basicLink) {
}
/**
* Process end of a Link.
*/
public void endLink() {
}
/**
* Process an ExternalGraphic.
* @param eg ExternalGraphic to process.
*/
public void image(ExternalGraphic eg) {
}
/**
* Process a pageRef.
*/
public void pageRef() {
}
/**
* Process an InstreamForeignObject.
* @param ifo InstreamForeignObject to process.
*/
public void foreignObject(InstreamForeignObject ifo) {
}
/**
* Process the start of a footnote.
* @param footnote Footnote that is starting
*/
public void startFootnote(Footnote footnote) {
}
/**
* Process the ending of a footnote.
* @param footnote Footnote that is ending
*/
public void endFootnote(Footnote footnote) {
}
/**
* Process the start of a footnote body.
* @param body FootnoteBody that is starting
*/
public void startFootnoteBody(FootnoteBody body) {
}
/**
* Process the ending of a footnote body.
* @param body FootnoteBody that is ending
*/
public void endFootnoteBody(FootnoteBody body) {
}
/**
* Process a Leader.
* @param l Leader to process.
*/
public void leader(Leader l) {
}
/**
* Process a Character.
* @param c Character to process.
*/
public void character(Character c) {
}
/**
* Process character data.
* @param data Array of characters to process.
* @param start Offset for characters to process.
* @param length Portion of array to process.
*/
public void characters(char data[], int start, int length) {
}
}