/* * $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.tools; import org.apache.fop.apps.*; import org.apache.fop.area.*; import org.apache.fop.area.inline.*; import org.apache.fop.area.inline.Character; import org.apache.fop.render.*; import org.apache.fop.render.pdf.*; import org.apache.fop.render.svg.*; import org.apache.fop.render.xml.*; import org.apache.fop.layout.FontInfo; import org.apache.fop.layout.FontState; import org.apache.fop.layout.FontMetric; import org.apache.fop.fo.FOUserAgent; import org.apache.fop.fo.properties.RuleStyle; import org.apache.avalon.framework.logger.ConsoleLogger; import org.apache.avalon.framework.logger.AbstractLogEnabled; import java.io.*; import java.util.*; import java.awt.geom.Rectangle2D; import java.util.StringTokenizer; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.*; import org.apache.batik.dom.svg.SVGDOMImplementation; import org.apache.batik.dom.util.DOMUtilities; /** * Area tree tester. * The purpose of this class is to create and render an area tree * for the purpose of testing the area tree and rendering. * This covers the set of possible properties that can be set * on the area tree for rendering. * As this is not for general purpose there is no attempt to handle * invalid area tree xml. * * Tests: different renderers, saving and loading pages with serialization * out of order rendering */ public class AreaTreeBuilder extends AbstractLogEnabled { /** */ public static void main(String[] args) { AreaTreeBuilder atb = new AreaTreeBuilder(); atb.enableLogging(new ConsoleLogger(ConsoleLogger.LEVEL_DEBUG)); atb.runTests(args[0], args[1], args[2]); System.exit(0); } /** * */ protected void runTests(String in, String type, String out) { getLogger().debug("Starting tests"); runTest(in, type, out); getLogger().debug("Finished"); } /** */ protected void runTest(String in, String type, String out) { Renderer rend = null; if ("xml".equals(type)) { rend = new XMLRenderer(); } else if ("pdf".equals(type)) { rend = new PDFRenderer(); } else if ("svg".equals(type)) { rend = new SVGRenderer(); } setupLogger(rend); FontInfo fi = new FontInfo(); rend.setupFontInfo(fi); FOUserAgent ua = new FOUserAgent(); setupLogger(ua); rend.setUserAgent(ua); AreaTree.StorePagesModel sm = AreaTree.createStorePagesModel(); TreeLoader tl = new TreeLoader(fi); tl.setTreeModel(sm); try { InputStream is = new BufferedInputStream(new FileInputStream(in)); tl.buildAreaTree(is); renderAreaTree(sm, rend, out); } catch (IOException e) { getLogger().error("error reading file" + e.getMessage(), e); } } protected void renderAreaTree(AreaTree.StorePagesModel sm, Renderer rend, String out) { try { OutputStream os = new BufferedOutputStream(new FileOutputStream(out)); rend.startRenderer(os); int count = 0; int seqc = sm.getPageSequenceCount(); while (count < seqc) { Title title = sm.getTitle(count); rend.startPageSequence(title); int pagec = sm.getPageCount(count); int c = 0; while (c < pagec) { PageViewport page = sm.getPage(count, c); c++; // save the page to a stream for testing /*ObjectOutputStream tempstream = new ObjectOutputStream( new BufferedOutputStream( new FileOutputStream("temp.ser"))); page.savePage(tempstream); tempstream.close(); File temp = new File("temp.ser"); getLogger().debug("page serialized to: " + temp.length()); temp = null; ObjectInputStream in = new ObjectInputStream( new BufferedInputStream( new FileInputStream("temp.ser"))); page.loadPage(in); in.close();*/ rend.renderPage(page); } count++; } rend.stopRenderer(); os.close(); } catch (Exception e) { getLogger().error("error rendering output", e); } } } // this loads an area tree from an xml file // the xml format is the same as the xml renderer output class TreeLoader { AreaTree areaTree; AreaTree.AreaTreeModel model; FontInfo fontInfo; FontState currentFontState; TreeLoader(FontInfo fi) { fontInfo = fi; } public void setTreeModel(AreaTree.AreaTreeModel mo) { model = mo; } public void buildAreaTree(InputStream is) { Document doc = null; try { DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance(); fact.setNamespaceAware(true); doc = fact.newDocumentBuilder().parse(is); } catch (Exception e) { e.printStackTrace(); } Element root = null; root = doc.getDocumentElement(); areaTree = new AreaTree(); areaTree.setTreeModel(model); readAreaTree(root); } public void readAreaTree(Element root) { NodeList childs = root.getChildNodes(); for (int i = 0; i < childs.getLength(); i++) { Node obj = childs.item(i); if (obj.getNodeName().equals("pageSequence")) { readPageSequence((Element) obj); } } } public void readPageSequence(Element root) { Title title = null; boolean started = false; NodeList childs = root.getChildNodes(); for (int i = 0; i < childs.getLength(); i++) { Node obj = childs.item(i); if (obj.getNodeName().equals("title")) { if (started) { // problem } else { title = readTitle((Element) obj); model.startPageSequence(title); started = true; } } else if (obj.getNodeName().equals("pageViewport")) { if (!started) { model.startPageSequence(null); started = true; } PageViewport viewport = readPageViewport((Element) obj); areaTree.addPage(viewport); } } } public Title readTitle(Element root) { Title title = new Title(); List childs = getInlineAreas(root); for (int i = 0; i < childs.size(); i++) { InlineArea obj = (InlineArea) childs.get(i); title.addInlineArea(obj); } return title; } public PageViewport readPageViewport(Element root) { Rectangle2D bounds = getRectangle(root, "bounds"); PageViewport viewport = null; NodeList childs = root.getChildNodes(); for (int i = 0; i < childs.getLength(); i++) { Node obj = childs.item(i); if (obj.getNodeName().equals("page")) { Page page = readPage((Element) obj); viewport = new PageViewport(page, bounds); } } return viewport; } public Page readPage(Element root) { String bounds = root.getAttribute("bounds"); Page page = new Page(); NodeList childs = root.getChildNodes(); for (int i = 0; i < childs.getLength(); i++) { Node obj = childs.item(i); if (obj.getNodeName().equals("regionViewport")) { readRegionViewport(page, (Element) obj); } } return page; } Rectangle2D getRectangle(Element root, String attr) { String rect = root.getAttribute(attr); StringTokenizer st = new StringTokenizer(rect, " "); int x = 0, y = 0, w = 0, h = 0; if (st.hasMoreTokens()) { String tok = st.nextToken(); x = Integer.parseInt(tok); } if (st.hasMoreTokens()) { String tok = st.nextToken(); y = Integer.parseInt(tok); } if (st.hasMoreTokens()) { String tok = st.nextToken(); w = Integer.parseInt(tok); } if (st.hasMoreTokens()) { String tok = st.nextToken(); h = Integer.parseInt(tok); } Rectangle2D r2d = new Rectangle2D.Float(x, y, w, h); return r2d; } public RegionViewport readRegionViewport(Page page, Element root) { RegionViewport reg = new RegionViewport(getRectangle(root, "rect")); NodeList childs = root.getChildNodes(); for (int i = 0; i < childs.getLength(); i++) { Node obj = childs.item(i); if (obj.getNodeName().equals("regionBefore")) { reg.setRegion(readRegion((Element) obj, RegionReference.BEFORE)); page.setRegion(RegionReference.BEFORE, reg); } else if (obj.getNodeName().equals("regionStart")) { reg.setRegion(readRegion((Element) obj, RegionReference.START)); page.setRegion(RegionReference.START, reg); } else if (obj.getNodeName().equals("regionBody")) { reg.setRegion(readRegion((Element) obj, RegionReference.BODY)); page.setRegion(RegionReference.BODY, reg); } else if (obj.getNodeName().equals("regionEnd")) { reg.setRegion(readRegion((Element) obj, RegionReference.END)); page.setRegion(RegionReference.END, reg); } else if (obj.getNodeName().equals("regionAfter")) { reg.setRegion(readRegion((Element) obj, RegionReference.AFTER)); page.setRegion(RegionReference.AFTER, reg); } } return reg; } public RegionReference readRegion(Element root, int type) { RegionReference reg; if (type == RegionReference.BODY) { BodyRegion br = new BodyRegion(); NodeList childs = root.getChildNodes(); for (int i = 0; i < childs.getLength(); i++) { Node obj = childs.item(i); if (obj.getNodeName().equals("beforeFloat")) { BeforeFloat bf = readBeforeFloat((Element) obj); br.setBeforeFloat(bf); } else if (obj.getNodeName().equals("mainReference")) { MainReference mr = readMainReference((Element) obj); br.setMainReference(mr); } else if (obj.getNodeName().equals("footnote")) { Footnote foot = readFootnote((Element) obj); br.setFootnote(foot); } } reg = br; } else { reg = new RegionReference(type); List blocks = getBlocks(root); for (int i = 0; i < blocks.size(); i++) { Block obj = (Block) blocks.get(i); reg.addBlock(obj); } } reg.setCTM(new CTM()); return reg; } public BeforeFloat readBeforeFloat(Element root) { BeforeFloat bf = new BeforeFloat(); List blocks = getBlocks(root); for (int i = 0; i < blocks.size(); i++) { Block obj = (Block) blocks.get(i); bf.addBlock(obj); } return bf; } public MainReference readMainReference(Element root) { MainReference mr = new MainReference(); List spans = getSpans(root); for (int i = 0; i < spans.size(); i++) {
/*
 * jQuery UI Tooltip @VERSION
 *
 * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * http://docs.jquery.com/UI/Tooltip
 *
 * Depends:
 *	jquery.ui.core.js
 *	jquery.ui.widget.js
 *	jquery.ui.position.js
 */
(function( $ ) {

var increments = 0;

$.widget( "ui.tooltip", {
	version: "@VERSION",
	options: {
		content: function() {
			return $( this ).attr( "title" );
		},
		hide: true,
		items: "[title]",
		position: {
			my: "left+15 center",
			at: "right center",
			collision: "flip fit"
		},
		show: true,
		tooltipClass: null,

		// callbacks
		close: null,
		open: null
	},

	_create: function() {
		this._bind({
			mouseover: "open",
			focusin: "open"
		});

		// IDs of generated tooltips, needed for destroy
		this.tooltips = {};
	},

	_setOption: function( key, value ) {
		if ( key === "disabled" ) {
			this[ value ? "_disable" : "_enable" ]();
			this.options[ key ] = value;
			// disable element style changes
			return;
		}
		this._super( "_setOption", key, value );
	},

	_disable: function() {
		var that = this;

		// close open tooltips
		$.each( this.tooltips, function( id, element ) {
			var event = $.Event( "blur" );
			event.target = event.currentTarget = element[0];
			that.close( event, true );
		});

		// remove title attributes to prevent native tooltips
		this.element.find( this.options.items ).andSelf().each(function() {
			var element = $( this );
			if ( element.is( "[title]" ) ) {
				element
					.data( "tooltip-title", element.attr( "title" ) )
					.attr( "title", "" );
			}
		});
	},

	_enable: function() {
		// restore title attributes
		this.element.find( this.options.items ).andSelf().each(function() {
			var element = $( this );
			if ( element.data( "tooltip-title" ) ) {
				element.attr( "title", element.data( "tooltip-title" ) );
			}
		});
	},

	open: function( event ) {
		var content,
			that = this,
			target = $( event ? event.target : this.element )
				.closest( this.options.items );

		// if aria-describedby exists, then the tooltip is already open
		if ( !target.length || target.attr( "aria-describedby" ) ) {
			return;
		}

		if ( !target.data( "tooltip-title" ) ) {
			target.data( "tooltip-title", target.attr( "title" ) );
		}

		content = this.options.content.call( target[0], function( response ) {
			// IE may instantly serve a cached response for ajax requests
			// delay this call to _open so the other call to _open runs first
			setTimeout(function() {
				that._open( event, target, response );
			}, 1 );
		});
		if ( content ) {
			that._open( event, target, content );
		}
	},

	_open: function( event, target, content ) {
		if ( !content ) {
			return;
		}

		// if we have a title, clear it to prevent the native tooltip
		// we have to check first to avoid defining a title if none exists
		// (we don't want to cause an element to start matching [title])
		// TODO: document why we don't use .removeAttr()
		if ( target.is( "[title]" ) ) {
			target.attr( "title", "" );
		}

		// ajaxy tooltip can update an existing one
		var tooltip = this._find( target );
		if ( !tooltip.length ) {
			tooltip = this._tooltip( target );
			target.attr( "aria-describedby", tooltip.attr( "id" ) );
		}
		tooltip.find( ".ui-tooltip-content" ).html( content );
		tooltip
			.stop( true )
			.position( $.extend({
				of: target
			}, this.options.position ) )
			.hide();

		this._show( tooltip, this.options.show );

		this._trigger( "open", event, { tooltip: tooltip } );

		this._bind( target, {
			mouseleave: "close",
			blur: "close"
		});
	},

	close: function( event, force ) {
		var that = this,
			target = $( event ? event.currentTarget : this.element ),
			tooltip = this._find( target );

		// don't close if the element has focus
		// this prevents the tooltip from closing if you hover while focused
		if ( !force && document.activeElement === target[0] ) {
			return;
		}

		// only set title if we had one before (see comment in _open())
		if ( target.data( "tooltip-title" ) ) {
			target.attr( "title", target.data( "tooltip-title" ) );
		}

		target.removeAttr( "aria-describedby" );

		tooltip.stop( true );
		this._hide( tooltip, this.options.hide, function() {
			$( this ).remove();
			delete that.tooltips[ this.id ];
		});

		target.unbind( "mouseleave.tooltip blur.tooltip" );

		this._trigger( "close", event, { tooltip: tooltip } );
	},

	_tooltip: function( element ) {
		var id = "ui-tooltip-" + increments++,
			tooltip = $( "<div>" )
				.attr({
					id: id,
					role: "tooltip"
				})
				.addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " +
					( this.options.tooltipClass || "" ) );
		$( "<div>" )
			.addClass( "ui-tooltip-content" )
			.appendTo( tooltip );
		tooltip.appendTo( document.body );
		if ( $.fn.bgiframe ) {
			tooltip.bgiframe();
		}
		this.tooltips[ id ] = element;
		return tooltip;
	},

	_find: function( target ) {
		var id = target.attr( "aria-describedby" );
		return id ? $( "#" + id ) : $();
	},

	_destroy: function() {
		$.each( this.tooltips, function( id ) {
			$( "#" + id ).remove();
		});
	}
});

}( jQuery ) );