aboutsummaryrefslogtreecommitdiffstats
path: root/fop/examples/plan
diff options
context:
space:
mode:
authorGlenn Adams <gadams@apache.org>2016-03-06 06:14:41 +0000
committerGlenn Adams <gadams@apache.org>2016-03-06 06:14:41 +0000
commit57949ba0cfffa2dd5933a103c6ad867de9f1e7a0 (patch)
treecd1d8100a9135449635251820f39f272151005ac /fop/examples/plan
parentc8cde713f54ca731f4a7f3bfaef8af9e8a1b9262 (diff)
downloadxmlgraphics-fop-57949ba0cfffa2dd5933a103c6ad867de9f1e7a0.tar.gz
xmlgraphics-fop-57949ba0cfffa2dd5933a103c6ad867de9f1e7a0.zip
Configure maven build.
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/maven@1733788 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'fop/examples/plan')
-rw-r--r--fop/examples/plan/README6
-rw-r--r--fop/examples/plan/build.xml149
-rw-r--r--fop/examples/plan/docs/june.xml84
-rw-r--r--fop/examples/plan/docs/plan.fo114
-rw-r--r--fop/examples/plan/resources/META-INF/services/org.apache.fop.fo.ElementMapping2
-rw-r--r--fop/examples/plan/resources/META-INF/services/org.apache.xmlgraphics.image.loader.spi.ImagePreloader1
-rw-r--r--fop/examples/plan/src/org/apache/fop/plan/ActionInfo.java80
-rw-r--r--fop/examples/plan/src/org/apache/fop/plan/EventList.java39
-rw-r--r--fop/examples/plan/src/org/apache/fop/plan/GroupInfo.java48
-rw-r--r--fop/examples/plan/src/org/apache/fop/plan/Main.java95
-rw-r--r--fop/examples/plan/src/org/apache/fop/plan/PlanDrawer.java33
-rw-r--r--fop/examples/plan/src/org/apache/fop/plan/PlanElement.java101
-rw-r--r--fop/examples/plan/src/org/apache/fop/plan/PlanElementMapping.java66
-rw-r--r--fop/examples/plan/src/org/apache/fop/plan/PlanHints.java46
-rw-r--r--fop/examples/plan/src/org/apache/fop/plan/PlanObj.java51
-rw-r--r--fop/examples/plan/src/org/apache/fop/plan/PlanRenderer.java227
-rw-r--r--fop/examples/plan/src/org/apache/fop/plan/PreloaderPlan.java135
-rw-r--r--fop/examples/plan/src/org/apache/fop/plan/SimplePlanDrawer.java321
18 files changed, 1598 insertions, 0 deletions
diff --git a/fop/examples/plan/README b/fop/examples/plan/README
new file mode 100644
index 000000000..5ebe57ee2
--- /dev/null
+++ b/fop/examples/plan/README
@@ -0,0 +1,6 @@
+FOP Plan Readme
+
+The plan extension is an addition to FOP that can be used to produce a simple
+plan diagram with tasks etc.
+
+See docs/plan.fo for further information.
diff --git a/fop/examples/plan/build.xml b/fop/examples/plan/build.xml
new file mode 100644
index 000000000..394310002
--- /dev/null
+++ b/fop/examples/plan/build.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0"?>
+<!--
+ 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$ -->
+<!-- ===========================================================================
+
+============================================================================ -->
+
+<project default="package" basedir=".">
+
+ <path id="libs-build-classpath">
+ <fileset dir="../../lib">
+ <include name="*.jar"/>
+ </fileset>
+ <fileset dir="../../build">
+ <include name="fop.jar"/>
+ </fileset>
+ </path>
+
+ <!-- =================================================================== -->
+ <!-- Initialization target -->
+ <!-- =================================================================== -->
+ <target name="init">
+ <tstamp/>
+ <property name="Name" value="Plan"/>
+ <property name="name" value="plan"/>
+ <property name="version" value="0.1-CVS"/>
+ <filter token="version" value="${version}"/>
+ <property name="year" value="2002"/>
+
+ <echo message="------------------- ${Name} ${version} [${year}] ----------------"/>
+
+ <property name="build.compiler" value="classic"/>
+ <property name="debug" value="on"/>
+ <property name="optimize" value="off"/>
+ <property name="deprecation" value="on"/>
+
+ <property name="src.dir" value="./src"/>
+ <property name="lib.dir" value="./lib"/>
+ <property name="packages" value="org.apache.fop.*"/>
+
+ <property name="build.dir" value="./build"/>
+ <property name="build.src" value="./build/src"/>
+ <property name="build.dest" value="./build/classes"/>
+
+ <property name="resource.dir" value="resources"/>
+ <property name="plan.dir" value="org/apache/fop/plan"/>
+
+ <property name="main.class" value="org.apache.fop.plan.Main"/>
+ <property name="runtime.classpath" value="fop.jar xml-apis.jar xercesImpl-2.2.1.jar xalan-2.4.1.jar batik.jar"/>
+
+ </target>
+
+ <!-- =================================================================== -->
+ <!-- Help on usage -->
+ <!-- =================================================================== -->
+ <target name="usage">
+ <echo message="Use the -projecthelp option instead"/>
+ </target>
+
+ <!-- =================================================================== -->
+ <!-- Prepares the build directory -->
+ <!-- =================================================================== -->
+ <target name="prepare" depends="init">
+ <!-- create directories -->
+ <echo message="Preparing the build directories"/>
+ <mkdir dir="${build.dir}"/>
+ <mkdir dir="${build.src}"/>
+ <mkdir dir="${build.src}/${plan.dir}"/>
+ </target>
+
+ <!-- =================================================================== -->
+ <!-- Prepares the source code -->
+ <!-- =================================================================== -->
+ <target name="prepare-src" depends="prepare">
+ <!-- copy src files -->
+ <copy todir="${build.src}">
+ <fileset dir="${src.dir}"
+ excludes="**/Makefile*, **/package.html"/>
+ </copy>
+ <copy todir="${build.dest}/">
+ <fileset dir="${resource.dir}"/>
+ </copy>
+ </target>
+
+ <!-- =================================================================== -->
+ <!-- Compiles the source directory -->
+ <!-- =================================================================== -->
+ <target name="compile" depends="prepare-src" description="Compile the Java sources">
+ <echo message="Compiling the sources "/>
+ <!-- create directories -->
+ <mkdir dir="${build.dest}"/>
+
+ <javac srcdir="${build.src}"
+ destdir="${build.dest}"
+ debug="${debug}"
+ deprecation="${deprecation}"
+ optimize="${optimize}"
+ excludes="">
+ <classpath refid="libs-build-classpath"/>
+ </javac>
+ </target>
+
+ <!-- =================================================================== -->
+ <!-- Creates the class package -->
+ <!-- =================================================================== -->
+ <target name="package" depends="compile" description="Create jar file">
+ <echo message="Creating the jar file ${build.dir}/${name}.jar"/>
+ <tstamp>
+ <format property="ts" pattern="yyyyMMdd-HHmmss-z"/>
+ </tstamp>
+
+ <jar jarfile="${build.dir}/${name}.jar"
+ basedir="${build.dest}"
+ includes="**">
+ <manifest>
+ <attribute name="Main-Class" value="${main.class}"/>
+ <attribute name="Class-Path" value="${runtime.classpath}"/>
+ <attribute name="Implementation-Title" value="${Name}"/>
+ <attribute name="Implementation-Version" value="${version}"/>
+ <attribute name="Implementation-Vendor" value="Apache Software Foundation (http://xmlgraphics.apache.org/fop/)"/>
+ <attribute name="Build-Id" value="${ts} (${user.name} [${os.name} ${os.version} ${os.arch}])"/>
+ </manifest>
+ </jar>
+ </target>
+
+ <!-- =================================================================== -->
+ <!-- Clean targets -->
+ <!-- =================================================================== -->
+ <target name="clean" depends="init" description="Cleans the build directory">
+ <delete dir="${build.dir}"/>
+ </target>
+
+</project>
+
diff --git a/fop/examples/plan/docs/june.xml b/fop/examples/plan/docs/june.xml
new file mode 100644
index 000000000..fa8c85cc0
--- /dev/null
+++ b/fop/examples/plan/docs/june.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan xmlns="http://xmlgraphics.apache.org/fop/plan" width="500" height="300" start="38320523" end="38320706">
+<title>Plan for June</title>
+<events>
+
+<group name="Bio-Park">
+<action type="grouping" id="construction">
+<label>Panel Installation</label>
+<owner>Constuctor Team</owner>
+<startdate>38320518</startdate>
+<enddate>38320607</enddate>
+</action>
+<action type="task" belongs="construction">
+<label>Integrety Test</label>
+<owner>Constuctor Team</owner>
+<startdate>38320527</startdate>
+<enddate>38320608</enddate>
+</action>
+<action type="milestone" depends="construction">
+<label>Shell Complete</label>
+<owner>Constuctor Team</owner>
+<startdate>38320608</startdate>
+</action>
+<action type="grouping">
+<label>Environment Installation</label>
+<owner>Enviros</owner>
+<startdate>38320608</startdate>
+<enddate>38320623</enddate>
+</action>
+<action type="task">
+<label>Gas</label>
+<owner>Enviros</owner>
+<startdate>38320608</startdate>
+<enddate>38320612</enddate>
+</action>
+</group>
+
+<group name="Education Centre">
+<action type="grouping">
+<label>Plan Optimisation</label>
+<owner>Simulators</owner>
+<startdate>38320602</startdate>
+<enddate>38320820</enddate>
+</action>
+<action type="task">
+<label>Simulation Params</label>
+<owner>Simulators</owner>
+<startdate>38320602</startdate>
+<enddate>38320610</enddate>
+</action>
+<action type="milestone">
+<label>Preparation Complete</label>
+<owner>Simulators</owner>
+<startdate>38320610</startdate>
+</action>
+<action type="grouping" id="simulation">
+<label>Paths</label>
+<owner>Simulators</owner>
+<startdate>38320610</startdate>
+<enddate>38320630</enddate>
+</action>
+<action type="task" id="opt" belongs="simulation">
+<label>Optimal Path</label>
+<owner>Simulators</owner>
+<startdate>38320610</startdate>
+<enddate>38320617</enddate>
+</action>
+<action type="task" belongs="simulation">
+<label>Alternatives</label>
+<owner>Simulators</owner>
+<startdate>38320617</startdate>
+<enddate>38320621</enddate>
+</action>
+<action type="task" depends="opt" belongs="simulation">
+<label>Risk Determination</label>
+<owner>Simulators</owner>
+<startdate>38320621</startdate>
+<enddate>38320630</enddate>
+</action>
+</group>
+
+</events>
+</plan>
+
diff --git a/fop/examples/plan/docs/plan.fo b/fop/examples/plan/docs/plan.fo
new file mode 100644
index 000000000..d47755b31
--- /dev/null
+++ b/fop/examples/plan/docs/plan.fo
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <fo:layout-master-set>
+ <fo:simple-page-master
+ margin-right="1.5cm"
+ margin-left="1.5cm"
+ margin-bottom="2cm"
+ margin-top="1cm"
+ page-width="21cm"
+ page-height="29.7cm"
+ master-name="first">
+ <fo:region-body margin-top="1cm"/>
+ <fo:region-before extent="1cm"/>
+ <fo:region-after extent="1.5cm"/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference="first">
+ <fo:static-content flow-name="xsl-region-before">
+ <fo:block line-height="14pt" font-size="10pt"
+ text-align="end">Plan Extension</fo:block>
+ </fo:static-content>
+ <fo:static-content flow-name="xsl-region-after">
+ <fo:block line-height="14pt" font-size="10pt"
+ text-align="end">Page <fo:page-number/></fo:block>
+ </fo:static-content>
+
+ <fo:flow flow-name="xsl-region-body">
+
+ <fo:block space-before.optimum="3pt" space-after.optimum="15pt">
+ The Plan Extension
+ </fo:block>
+
+ <fo:block space-before.optimum="3pt" space-after.optimum="15pt">
+The plan extension is an addition to FOP that can be used to produce a
+simple plan diagram with tasks etc.
+ </fo:block>
+
+ <fo:block space-before.optimum="3pt" space-after.optimum="15pt">
+ Options
+ </fo:block>
+
+ <fo:block space-before.optimum="3pt" space-after.optimum="15pt">
+There a few basic options to specify the width, height and type of graph.
+The start and end date to display is optional.
+The locale specific information can also be specified.
+All other options are set in the style attribute.
+ </fo:block>
+
+ <fo:block space-before.optimum="3pt" space-after.optimum="15pt">
+ Types of Graphs
+ </fo:block>
+
+ <fo:block space-before.optimum="3pt" space-after.optimum="15pt">
+ Sample Action Plan
+ </fo:block>
+
+ <fo:block space-before.optimum="3pt" space-after.optimum="15pt">
+<fo:block space-after.optimum="5pt">
+<fo:instream-foreign-object>
+<plan xmlns="http://xmlgraphics.apache.org/fop/plan" width="500" height="200" start="20020612" end="20020702">
+<title>Example Plan</title>
+<events>
+
+<group name="Task Group">
+<action type="grouping" id="gr1">
+<label>First Task</label>
+<owner>Team</owner>
+<startdate>20020618</startdate>
+<enddate>20020630</enddate>
+</action>
+<action type="task" belongs="gr1">
+<label>Another Task</label>
+<owner>Team</owner>
+<startdate>20020620</startdate>
+<enddate>20020627</enddate>
+</action>
+<action type="milestone" depends="gr1">
+<label>Milestone</label>
+<owner>Team</owner>
+<startdate>20020628</startdate>
+</action>
+<action type="grouping">
+<label>Task</label>
+<owner>Team</owner>
+<startdate>20020620</startdate>
+<enddate>20020630</enddate>
+</action>
+<action type="task">
+<label>Difficult Task</label>
+<owner>individual</owner>
+<startdate>20020620</startdate>
+<enddate>20020630</enddate>
+</action>
+</group>
+
+</events>
+</plan>
+</fo:instream-foreign-object>
+</fo:block>
+
+ </fo:block>
+
+ <fo:block>
+A plan as an external graphic.
+ </fo:block>
+
+ <fo:block>
+<fo:external-graphic src="june.xml"/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+</fo:root>
+
diff --git a/fop/examples/plan/resources/META-INF/services/org.apache.fop.fo.ElementMapping b/fop/examples/plan/resources/META-INF/services/org.apache.fop.fo.ElementMapping
new file mode 100644
index 000000000..7c6c472bd
--- /dev/null
+++ b/fop/examples/plan/resources/META-INF/services/org.apache.fop.fo.ElementMapping
@@ -0,0 +1,2 @@
+org.apache.fop.plan.PlanElementMapping
+
diff --git a/fop/examples/plan/resources/META-INF/services/org.apache.xmlgraphics.image.loader.spi.ImagePreloader b/fop/examples/plan/resources/META-INF/services/org.apache.xmlgraphics.image.loader.spi.ImagePreloader
new file mode 100644
index 000000000..444080090
--- /dev/null
+++ b/fop/examples/plan/resources/META-INF/services/org.apache.xmlgraphics.image.loader.spi.ImagePreloader
@@ -0,0 +1 @@
+org.apache.fop.plan.PreloaderPlan
diff --git a/fop/examples/plan/src/org/apache/fop/plan/ActionInfo.java b/fop/examples/plan/src/org/apache/fop/plan/ActionInfo.java
new file mode 100644
index 000000000..1535ed5ec
--- /dev/null
+++ b/fop/examples/plan/src/org/apache/fop/plan/ActionInfo.java
@@ -0,0 +1,80 @@
+/*
+ * 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.plan;
+
+import java.util.Date;
+
+public class ActionInfo {
+
+ public static final int TASK = 1;
+ public static final int MILESTONE = 2;
+ public static final int GROUPING = 3;
+
+ private Date startDate;
+ private Date endDate;
+ private String owner;
+ private String label;
+ private int type = TASK;
+ private String dependant = "";
+
+ public void setType(int t) {
+ type = t;
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public void setLabel(String str) {
+ label = str;
+ }
+
+ public void setOwner(String str) {
+ owner = str;
+ }
+
+ public void setStartDate(Date sd) {
+ startDate = sd;
+ if (endDate == null) {
+ endDate = startDate;
+ }
+ }
+
+ public void setEndDate(Date ed) {
+ endDate = ed;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public String getOwner() {
+ return owner;
+ }
+
+ public Date getStartDate() {
+ return startDate;
+ }
+
+ public Date getEndDate() {
+ return endDate;
+ }
+
+}
diff --git a/fop/examples/plan/src/org/apache/fop/plan/EventList.java b/fop/examples/plan/src/org/apache/fop/plan/EventList.java
new file mode 100644
index 000000000..53b32f7c0
--- /dev/null
+++ b/fop/examples/plan/src/org/apache/fop/plan/EventList.java
@@ -0,0 +1,39 @@
+/*
+ * 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.plan;
+
+import java.util.List;
+
+public class EventList {
+
+ private List data = new java.util.ArrayList();
+
+ public void addGroupInfo(GroupInfo set) {
+ data.add(set);
+ }
+
+ public int getSize() {
+ return data.size();
+ }
+
+ public GroupInfo getGroupInfo(int count) {
+ return (GroupInfo) data.get(count);
+ }
+}
diff --git a/fop/examples/plan/src/org/apache/fop/plan/GroupInfo.java b/fop/examples/plan/src/org/apache/fop/plan/GroupInfo.java
new file mode 100644
index 000000000..a83228197
--- /dev/null
+++ b/fop/examples/plan/src/org/apache/fop/plan/GroupInfo.java
@@ -0,0 +1,48 @@
+/*
+ * 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.plan;
+
+import java.util.List;
+
+public class GroupInfo {
+
+ private String name;
+ private List actions = new java.util.ArrayList();
+
+ public GroupInfo(String n) {
+ name = n;
+ }
+
+ public void addActionInfo(ActionInfo ai) {
+ actions.add(ai);
+ }
+
+ public int getSize() {
+ return actions.size();
+ }
+
+ public ActionInfo getActionInfo(int c) {
+ return (ActionInfo) actions.get(c);
+ }
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/fop/examples/plan/src/org/apache/fop/plan/Main.java b/fop/examples/plan/src/org/apache/fop/plan/Main.java
new file mode 100644
index 000000000..7b6f5a05e
--- /dev/null
+++ b/fop/examples/plan/src/org/apache/fop/plan/Main.java
@@ -0,0 +1,95 @@
+/*
+ * 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.plan;
+
+import java.io.InputStream;
+import java.io.Writer;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import org.apache.batik.transcoder.svg2svg.SVGTranscoder;
+import org.apache.batik.transcoder.TranscoderInput;
+import org.apache.batik.transcoder.TranscoderOutput;
+
+/**
+ * Sample command-line application for converting plan XML to SVG.
+ */
+public class Main {
+
+ /**
+ * Main method.
+ * @param args command-line arguments
+ */
+ public static void main(String[] args) {
+ Main main = new Main();
+ main.convert(args);
+ System.exit(0);
+ }
+
+ /**
+ * Runs the conversion
+ * @param params command-line arguments
+ */
+ public void convert(String[] params) {
+ if (params.length != 2) {
+ System.out.println("arguments: plan.xml output.svg");
+ return;
+ }
+ try {
+ InputStream is = new java.io.FileInputStream(params[0]);
+ Document doc = createSVGDocument(is);
+ SVGTranscoder svgT = new SVGTranscoder();
+ TranscoderInput input = new TranscoderInput(doc);
+ Writer ostream = new java.io.FileWriter(params[1]);
+ TranscoderOutput output = new TranscoderOutput(ostream);
+ svgT.transcode(input, output);
+ ostream.flush();
+ ostream.close();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Helper method to create the SVG document from the plan InputStream.
+ * @param is InputStream
+ * @return Document a DOM containing the SVG
+ */
+ public Document createSVGDocument(InputStream is) {
+ Document doc = null;
+
+ Element root = null;
+ try {
+ doc = javax.xml.parsers.DocumentBuilderFactory.newInstance().
+ newDocumentBuilder().parse(is);
+
+ root = doc.getDocumentElement();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ PlanRenderer gr = new PlanRenderer();
+ gr.setFontInfo("sansserif", 12);
+ Document svgdoc = gr.createSVGDocument(doc);
+ return svgdoc;
+ }
+}
diff --git a/fop/examples/plan/src/org/apache/fop/plan/PlanDrawer.java b/fop/examples/plan/src/org/apache/fop/plan/PlanDrawer.java
new file mode 100644
index 000000000..7f79bb737
--- /dev/null
+++ b/fop/examples/plan/src/org/apache/fop/plan/PlanDrawer.java
@@ -0,0 +1,33 @@
+/*
+ * 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.plan;
+
+import java.util.HashMap;
+
+import org.w3c.dom.Document;
+
+/**
+ * This interface defines how a plan drawer is converted.
+ */
+public interface PlanDrawer {
+
+ Document createDocument(EventList data, float w, float h,
+ HashMap hints);
+}
diff --git a/fop/examples/plan/src/org/apache/fop/plan/PlanElement.java b/fop/examples/plan/src/org/apache/fop/plan/PlanElement.java
new file mode 100644
index 000000000..e7fb8a1e7
--- /dev/null
+++ b/fop/examples/plan/src/org/apache/fop/plan/PlanElement.java
@@ -0,0 +1,101 @@
+/*
+ * 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.plan;
+
+import java.awt.geom.Point2D;
+
+import org.w3c.dom.Document;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+
+import org.apache.fop.apps.FOPException;
+import org.apache.fop.fo.FONode;
+import org.apache.fop.fo.PropertyList;
+
+/**
+ * This class defines the plan element.
+ */
+public class PlanElement extends PlanObj {
+
+ private Document svgDoc = null;
+ private float width;
+ private float height;
+ private boolean converted;
+
+ /**
+ * @see org.apache.fop.fo.FONode#FONode(FONode)
+ */
+ public PlanElement(FONode parent) {
+ super(parent);
+ }
+
+ /** {@inheritDoc} */
+ public void processNode(String elementName, Locator locator,
+ Attributes attlist, PropertyList propertyList)
+ throws FOPException {
+ super.processNode(elementName, locator, attlist, propertyList);
+ createBasicDocument();
+ }
+
+ /**
+ * Converts the element to SVG.
+ */
+ public void convertToSVG() {
+ try {
+ if (!converted) {
+ converted = true;
+ PlanRenderer pr = new PlanRenderer();
+ pr.setFontInfo("Helvetica", 12);
+ svgDoc = pr.createSVGDocument(doc);
+ width = pr.getWidth();
+ height = pr.getHeight();
+
+ doc = svgDoc;
+ }
+ } catch (Throwable t) {
+ getLogger().error("Could not convert Plan to SVG", t);
+ width = 0;
+ height = 0;
+ }
+
+ }
+
+ /** {@inheritDoc} */
+ public Document getDOMDocument() {
+ convertToSVG();
+ return doc;
+ }
+
+ /** {@inheritDoc} */
+ public String getNamespaceURI() {
+ if (svgDoc == null) {
+ return PlanElementMapping.NAMESPACE;
+ }
+ return "http://www.w3.org/2000/svg";
+ }
+
+ /** {@inheritDoc} */
+ public Point2D getDimension(Point2D view) {
+ convertToSVG();
+ return new Point2D.Float(width, height);
+ }
+}
+
diff --git a/fop/examples/plan/src/org/apache/fop/plan/PlanElementMapping.java b/fop/examples/plan/src/org/apache/fop/plan/PlanElementMapping.java
new file mode 100644
index 000000000..5b8a0b5bb
--- /dev/null
+++ b/fop/examples/plan/src/org/apache/fop/plan/PlanElementMapping.java
@@ -0,0 +1,66 @@
+/*
+ * 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.plan;
+
+import org.w3c.dom.DOMImplementation;
+
+import org.apache.fop.fo.ElementMapping;
+import org.apache.fop.fo.FONode;
+
+/**
+ * This class provides the element mapping for FOP.
+ */
+public class PlanElementMapping extends ElementMapping {
+
+ /** Plan Namespace */
+ public static final String NAMESPACE = "http://xmlgraphics.apache.org/fop/plan";
+
+ /** Main constructor. */
+ public PlanElementMapping() {
+ this.namespaceURI = NAMESPACE;
+ }
+
+ /** {@inheritDoc} */
+ public DOMImplementation getDOMImplementation() {
+ return getDefaultDOMImplementation();
+ }
+
+ /** {@inheritDoc} */
+ protected void initialize() {
+ if (foObjs == null) {
+ foObjs = new java.util.HashMap<String, Maker>();
+ foObjs.put("plan", new PE());
+ foObjs.put(DEFAULT, new PlanMaker());
+ }
+ }
+
+ static class PlanMaker extends ElementMapping.Maker {
+ public FONode make(FONode parent) {
+ return new PlanObj(parent);
+ }
+ }
+
+ static class PE extends ElementMapping.Maker {
+ public FONode make(FONode parent) {
+ return new PlanElement(parent);
+ }
+ }
+
+}
diff --git a/fop/examples/plan/src/org/apache/fop/plan/PlanHints.java b/fop/examples/plan/src/org/apache/fop/plan/PlanHints.java
new file mode 100644
index 000000000..a50d91139
--- /dev/null
+++ b/fop/examples/plan/src/org/apache/fop/plan/PlanHints.java
@@ -0,0 +1,46 @@
+/*
+ * 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.plan;
+
+/**
+ * This interface defines some constants for use in the plan package.
+ */
+public interface PlanHints {
+
+ /** Border attribute */
+ String PLAN_BORDER = "border";
+ /** Legend attribute */
+ String PLAN_LEGEND = "legend";
+ /** Font family attribute */
+ String FONT_FAMILY = "font-family";
+ /** Font size attribute */
+ String FONT_SIZE = "font-size";
+ /** Legent type attribute */
+ String LEGEND_TYPE = "legendType";
+ /** Locale attribute */
+ String LOCALE = "locale";
+ /** Label type attribute */
+ String LABEL_TYPE = "labelType";
+ /** Label font size attribute */
+ String LABEL_FONT_SIZE = "labelFontSize";
+ /** Label font attribute */
+ String LABEL_FONT = "labelFont";
+
+}
diff --git a/fop/examples/plan/src/org/apache/fop/plan/PlanObj.java b/fop/examples/plan/src/org/apache/fop/plan/PlanObj.java
new file mode 100644
index 000000000..ca26a8039
--- /dev/null
+++ b/fop/examples/plan/src/org/apache/fop/plan/PlanObj.java
@@ -0,0 +1,51 @@
+/*
+ * 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.plan;
+
+// FOP
+import org.apache.fop.fo.FONode;
+import org.apache.fop.fo.XMLObj;
+
+/**
+ * Since SVG objects are not layed out then this class checks
+ * that this element is not being layed out inside some incorrect
+ * element.
+ */
+public class PlanObj extends XMLObj {
+
+ /**
+ * Creates a new Plan object.
+ * @param parent the parent formatting object
+ */
+ public PlanObj(FONode parent) {
+ super(parent);
+ }
+
+ /** {@inheritDoc} */
+ public String getNamespaceURI() {
+ return PlanElementMapping.NAMESPACE;
+ }
+
+ /** {@inheritDoc} */
+ public String getNormalNamespacePrefix() {
+ return "plan";
+ }
+}
+
diff --git a/fop/examples/plan/src/org/apache/fop/plan/PlanRenderer.java b/fop/examples/plan/src/org/apache/fop/plan/PlanRenderer.java
new file mode 100644
index 000000000..7d41962fb
--- /dev/null
+++ b/fop/examples/plan/src/org/apache/fop/plan/PlanRenderer.java
@@ -0,0 +1,227 @@
+/*
+ * 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.plan;
+
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.StringTokenizer;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import org.apache.batik.dom.svg.SVGDOMImplementation;
+
+public class PlanRenderer {
+
+ private static final String SVG_NAMESPACE = SVGDOMImplementation.SVG_NAMESPACE_URI;
+
+ private String fontFamily = "sansserif";
+ private float fontSize = 12;
+ private String type = "";
+ private String lang = "";
+ private String country = "";
+ private String variant = "";
+ private float width;
+ private float height;
+ private float topEdge;
+ private float rightEdge;
+ private HashMap hints = new HashMap();
+
+ private String[] colours;
+ private String[] darkcolours;
+
+ public void setFontInfo(String fam, float si) {
+ fontFamily = fam;
+ fontSize = si;
+ }
+
+ public float getWidth() {
+ return width;
+ }
+
+ public float getHeight() {
+ return height;
+ }
+
+ protected float toFloat(String str) {
+ return Float.parseFloat(str);
+ }
+
+ public Document createSVGDocument(Document planDoc) {
+
+ Element svgRoot = planDoc.getDocumentElement();
+
+ width = toFloat(svgRoot.getAttribute("width"));
+ height = toFloat(svgRoot.getAttribute("height"));
+ type = svgRoot.getAttribute("type");
+ lang = svgRoot.getAttribute("lang");
+ country = svgRoot.getAttribute("country");
+ variant = svgRoot.getAttribute("variant");
+ String style = svgRoot.getAttribute("style");
+ parseStyle(style);
+
+ Locale locale = new Locale(lang, country == null ? "" : country,
+ variant == null ? "" : variant);
+
+ String start = svgRoot.getAttribute("start");
+ String end = svgRoot.getAttribute("end");
+ Date sd = getDate(start, locale);
+ Date ed = getDate(end, locale);
+
+ String title = "";
+ EventList data = null;
+ NodeList childs = svgRoot.getChildNodes();
+ for (int i = 0; i < childs.getLength(); i++) {
+ Node obj = childs.item(i);
+ String nname = obj.getNodeName();
+ if (nname.equals("title")) {
+ title = ((Element) obj).getFirstChild().getNodeValue();
+ } else if (nname.equals("events")) {
+ data = getEvents((Element) obj, locale);
+ }
+ }
+
+ SimplePlanDrawer planDrawer = new SimplePlanDrawer();
+ planDrawer.setStartDate(sd);
+ planDrawer.setEndDate(ed);
+ hints.put(PlanHints.FONT_FAMILY, fontFamily);
+ hints.put(PlanHints.FONT_SIZE, new Float(fontSize));
+ hints.put(PlanHints.LOCALE, locale);
+ Document doc
+ = planDrawer.createDocument(data, width, height, hints);
+ return doc;
+ }
+
+ protected void parseStyle(String style) {
+ hints.put(PlanHints.PLAN_BORDER, new Boolean(true));
+ hints.put(PlanHints.FONT_FAMILY, fontFamily);
+ hints.put(PlanHints.FONT_SIZE, new Float(fontSize));
+ hints.put(PlanHints.LABEL_FONT_SIZE, new Float(fontSize));
+ hints.put(PlanHints.LABEL_FONT, fontFamily);
+ hints.put(PlanHints.LABEL_TYPE, "textOnly");
+
+ StringTokenizer st = new StringTokenizer(style, ";");
+ while (st.hasMoreTokens()) {
+ String pair = st.nextToken().trim();
+ int index = pair.indexOf(":");
+ String name = pair.substring(0, index).trim();
+ String val = pair.substring(index + 1).trim();
+ if (name.equals(PlanHints.PLAN_BORDER)) {
+ hints.put(name, Boolean.valueOf(val));
+ } else if (name.equals(PlanHints.FONT_SIZE)) {
+ hints.put(name, Float.valueOf(val));
+ } else if (name.equals(PlanHints.LABEL_FONT_SIZE)) {
+ hints.put(name, Float.valueOf(val));
+ } else {
+ hints.put(name, val);
+ }
+ }
+ }
+
+ public ActionInfo getActionInfo(Element ele, Locale locale) {
+ String t = ele.getAttribute("type");
+
+ NodeList childs = ele.getChildNodes();
+ ActionInfo data = new ActionInfo();
+ if (t.equals("milestone")) {
+ data.setType(ActionInfo.MILESTONE);
+ } else if (t.equals("task")) {
+ data.setType(ActionInfo.TASK);
+ } else if (t.equals("grouping")) {
+ data.setType(ActionInfo.GROUPING);
+ } else {
+ throw new IllegalArgumentException("Unknown action type: " + t);
+ }
+
+ for (int i = 0; i < childs.getLength(); i++) {
+ Node obj = childs.item(i);
+ String nname = obj.getNodeName();
+ if (nname.equals("label")) {
+ String dat = ((Element) obj).getFirstChild().getNodeValue();
+ data.setLabel(dat);
+ } else if (nname.equals("owner")) {
+ String dat = ((Element) obj).getFirstChild().getNodeValue();
+ data.setOwner(dat);
+ } else if (nname.equals("startdate")) {
+ Date dat = getDate((Element) obj, locale);
+ data.setStartDate(dat);
+ } else if (nname.equals("enddate")) {
+ Date dat = getDate((Element) obj, locale);
+ data.setEndDate(dat);
+ }
+ }
+ return data;
+ }
+
+ public EventList getEvents(Element ele, Locale locale) {
+ EventList data = new EventList();
+ NodeList childs = ele.getChildNodes();
+ for (int i = 0; i < childs.getLength(); i++) {
+ Node obj = childs.item(i);
+ if (obj.getNodeName().equals("group")) {
+ GroupInfo dat = getGroupInfo((Element) obj, locale);
+ data.addGroupInfo(dat);
+ }
+ }
+ return data;
+ }
+
+ public GroupInfo getGroupInfo(Element ele, Locale locale) {
+ NodeList childs = ele.getChildNodes();
+ GroupInfo data = new GroupInfo(ele.getAttribute("name"));
+ for (int i = 0; i < childs.getLength(); i++) {
+ Node obj = childs.item(i);
+ if (obj.getNodeName().equals("action")) {
+ ActionInfo dat = getActionInfo((Element) obj, locale);
+ data.addActionInfo(dat);
+ }
+ }
+ return data;
+ }
+
+ public Date getDate(Element ele, Locale locale) {
+ String label = ele.getFirstChild().getNodeValue();
+ return getDate(label, locale);
+ }
+
+ public Date getDate(String label, Locale locale) {
+ Calendar cal = Calendar.getInstance(locale);
+
+ String str;
+ str = label.substring(0, 4);
+ int intVal = Integer.valueOf(str).intValue();
+ cal.set(Calendar.YEAR, intVal);
+
+ str = label.substring(4, 6);
+ intVal = Integer.valueOf(str).intValue();
+ cal.set(Calendar.MONTH, intVal - 1);
+
+ str = label.substring(6, 8);
+ intVal = Integer.valueOf(str).intValue();
+ cal.set(Calendar.DATE, intVal);
+ return cal.getTime();
+ }
+}
+
diff --git a/fop/examples/plan/src/org/apache/fop/plan/PreloaderPlan.java b/fop/examples/plan/src/org/apache/fop/plan/PreloaderPlan.java
new file mode 100644
index 000000000..d88658c37
--- /dev/null
+++ b/fop/examples/plan/src/org/apache/fop/plan/PreloaderPlan.java
@@ -0,0 +1,135 @@
+/*
+ * 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.plan;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.xml.transform.ErrorListener;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.xmlgraphics.image.loader.Image;
+import org.apache.xmlgraphics.image.loader.ImageContext;
+import org.apache.xmlgraphics.image.loader.ImageInfo;
+import org.apache.xmlgraphics.image.loader.ImageSize;
+import org.apache.xmlgraphics.image.loader.impl.AbstractImagePreloader;
+import org.apache.xmlgraphics.image.loader.impl.ImageXMLDOM;
+import org.apache.xmlgraphics.image.loader.util.ImageUtil;
+import org.apache.xmlgraphics.io.XmlSourceUtil;
+
+import org.apache.fop.util.DefaultErrorListener;
+import org.apache.fop.util.UnclosableInputStream;
+
+/**
+ * Image preloader for Plan images.
+ */
+public class PreloaderPlan extends AbstractImagePreloader {
+
+ /** Logger instance */
+ private static Log log = LogFactory.getLog(PreloaderPlan.class);
+
+ /** {@inheritDoc} */
+ public ImageInfo preloadImage(String uri, Source src, ImageContext context)
+ throws IOException {
+ if (!ImageUtil.hasInputStream(src)) {
+ //TODO Remove this and support DOMSource and possibly SAXSource
+ return null;
+ }
+ ImageInfo info = getImage(uri, src, context);
+ if (info != null) {
+ ImageUtil.closeQuietly(src); //Image is fully read
+ }
+ return info;
+ }
+
+ private ImageInfo getImage(String uri, Source src, ImageContext context) throws IOException {
+
+ InputStream in = new UnclosableInputStream(ImageUtil.needInputStream(src));
+ try {
+ Document planDoc = getDocument(in);
+ Element rootEl = planDoc.getDocumentElement();
+ if (!PlanElementMapping.NAMESPACE.equals(
+ rootEl.getNamespaceURI())) {
+ in.reset();
+ return null;
+ }
+
+ //Have to render the plan to know its size
+ PlanRenderer pr = new PlanRenderer();
+ Document svgDoc = pr.createSVGDocument(planDoc);
+ float width = pr.getWidth();
+ float height = pr.getHeight();
+
+ //Return converted SVG image
+ ImageInfo info = new ImageInfo(uri, "image/svg+xml");
+ final ImageSize size = new ImageSize();
+ size.setSizeInMillipoints(
+ Math.round(width * 1000),
+ Math.round(height * 1000));
+ //Set the resolution to that of the FOUserAgent
+ size.setResolution(context.getSourceResolution());
+ size.calcPixelsFromSize();
+ info.setSize(size);
+
+ //The whole image had to be loaded for this, so keep it
+ Image image = new ImageXMLDOM(info, svgDoc,
+ svgDoc.getDocumentElement().getNamespaceURI());
+ info.getCustomObjects().put(ImageInfo.ORIGINAL_IMAGE, image);
+
+ return info;
+ } catch (TransformerException e) {
+ try {
+ in.reset();
+ } catch (IOException ioe) {
+ // we're more interested in the original exception
+ }
+ log.debug("Error while trying to parsing a Plan file: "
+ + e.getMessage());
+ return null;
+ }
+ }
+
+ private Document getDocument(InputStream in) throws TransformerException {
+ TransformerFactory tFactory = TransformerFactory.newInstance();
+ //Custom error listener to minimize output to console
+ ErrorListener errorListener = new DefaultErrorListener(log);
+ tFactory.setErrorListener(errorListener);
+ Transformer transformer = tFactory.newTransformer();
+ transformer.setErrorListener(errorListener);
+ Source source = new StreamSource(in);
+ DOMResult res = new DOMResult();
+ transformer.transform(source, res);
+
+ Document doc = (Document)res.getNode();
+ return doc;
+ }
+
+}
diff --git a/fop/examples/plan/src/org/apache/fop/plan/SimplePlanDrawer.java b/fop/examples/plan/src/org/apache/fop/plan/SimplePlanDrawer.java
new file mode 100644
index 000000000..a8ba062ed
--- /dev/null
+++ b/fop/examples/plan/src/org/apache/fop/plan/SimplePlanDrawer.java
@@ -0,0 +1,321 @@
+/*
+ * 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.plan;
+
+import java.text.DateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import org.apache.batik.dom.svg.SVGDOMImplementation;
+
+import org.apache.fop.svg.SVGUtilities;
+
+/**
+ * Simple plan drawer implementation.
+ */
+public class SimplePlanDrawer implements PlanDrawer {
+
+ private static final String SVG_NAMESPACE = SVGDOMImplementation.SVG_NAMESPACE_URI;
+
+ private float fontSize;
+ private HashMap hints;
+ private java.awt.Font font = null;
+ private boolean bord = false;
+ private float lSpace = 15;
+ private float width;
+ private float height;
+ private float topEdge;
+ private float rightEdge;
+
+ private String[] colours;
+ private String[] darkcolours;
+
+ private Date startDate;
+ private Date endDate;
+
+ /**
+ * Sets the start date.
+ * @param sd start date
+ */
+ public void setStartDate(Date sd) {
+ startDate = sd;
+ }
+
+ /**
+ * Sets the end date.
+ * @param ed end date
+ */
+ public void setEndDate(Date ed) {
+ endDate = ed;
+ }
+
+ /**
+ * @see org.apache.fop.plan.PlanDrawer#createDocument(EventList, float, float, HashMap)
+ */
+ public Document createDocument(EventList data, float w, float h,
+ HashMap hints) {
+ this.width = w;
+ this.height = h;
+ this.hints = hints;
+ fontSize = ((Float) hints.get(PlanHints.FONT_SIZE)).floatValue();
+ bord = ((Boolean) hints.get(PlanHints.PLAN_BORDER)).booleanValue();
+
+ String title = "";
+
+ DOMImplementation impl
+ = SVGDOMImplementation.getDOMImplementation();
+ Document doc = impl.createDocument(SVG_NAMESPACE, "svg", null);
+
+ Element svgRoot = doc.getDocumentElement();
+ svgRoot.setAttributeNS(null, "width", Float.toString(width));
+ svgRoot.setAttributeNS(null, "height", Float.toString(height));
+ svgRoot.setAttributeNS(null, "viewBox",
+ "0 0 " + Float.toString(width) + " " + Float.toString(height));
+ svgRoot.setAttributeNS(null, "style",
+ "font-size:" + 8
+ + ";font-family:"
+ + hints.get(PlanHints.FONT_FAMILY));
+
+ font = new java.awt.Font((String)hints.get(PlanHints.FONT_FAMILY),
+ java.awt.Font.PLAIN, (int)fontSize);
+
+ if (bord) {
+ Element border
+ = SVGUtilities.createRect(doc, 0, 0, width, height);
+ border.setAttributeNS(null, "style", "stroke:black;fill:none");
+ svgRoot.appendChild(border);
+ }
+
+ float strwidth = SVGUtilities.getStringWidth(title, font);
+
+ Element text;
+ float pos = (float)(80 - strwidth / 2.0);
+ if (pos < 5) {
+ pos = 5;
+ }
+ text = SVGUtilities.createText(doc, pos, 18, title);
+ text.setAttributeNS(null, "style", "font-size:14");
+ svgRoot.appendChild(text);
+
+ topEdge = SVGUtilities.getStringHeight(title, font) + 5;
+
+ // add the actual pie chart
+ addPlan(doc, svgRoot, data);
+ //addLegend(doc, svgRoot, data);
+
+ return doc;
+ }
+
+ protected void addPlan(Document doc, Element svgRoot, EventList data) {
+ Date currentDate = new Date();
+
+ Date lastWeek = startDate;
+ Date future = endDate;
+ Calendar lw = Calendar.getInstance();
+ if (lastWeek == null || future == null) {
+ int dow = lw.get(Calendar.DAY_OF_WEEK);
+ lw.add(Calendar.DATE, -dow - 6);
+ lastWeek = lw.getTime();
+ lw.add(Calendar.DATE, 5 * 7);
+ future = lw.getTime();
+ }
+ long totalDays = (long)((future.getTime() - lastWeek.getTime() + 43200000) / 86400000);
+ lw.setTime(lastWeek);
+ int startDay = lw.get(Calendar.DAY_OF_WEEK);
+
+ float graphTop = topEdge;
+ Element g;
+ Element line;
+ line = SVGUtilities.createLine(doc, 0, topEdge, width, topEdge);
+ line.setAttributeNS(null, "style", "fill:none;stroke:black");
+ svgRoot.appendChild(line);
+
+ Element clip1 = SVGUtilities.createClip(doc,
+ SVGUtilities.createPath(doc,
+ "m0 0l126 0l0 " + height + "l-126 0z"), "clip1");
+ Element clip2 = SVGUtilities.createClip(doc,
+ SVGUtilities.createPath(doc,
+ "m130 0l66 0l0 " + height + "l-66 0z"), "clip2");
+ Element clip3 = SVGUtilities.createClip(doc,
+ SVGUtilities.createPath(doc,
+ "m200 0l" + (width - 200) + " 0l0 " + height + "l-"
+ + (width - 200) + " 0z"), "clip3");
+ svgRoot.appendChild(clip1);
+ svgRoot.appendChild(clip2);
+ svgRoot.appendChild(clip3);
+
+ DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
+ Element text;
+ text = SVGUtilities.createText(doc, 201, topEdge - 1,
+ df.format(lastWeek));
+ svgRoot.appendChild(text);
+
+ text = SVGUtilities.createText(doc, width, topEdge - 1,
+ df.format(future));
+ text.setAttributeNS(null, "text-anchor", "end");
+ svgRoot.appendChild(text);
+
+ line = SVGUtilities.createLine(doc, 128, topEdge, 128, height);
+ line.setAttributeNS(null, "style", "fill:none;stroke:rgb(150,150,150)");
+ svgRoot.appendChild(line);
+ int offset = 0;
+ for (int count = startDay; count < startDay + totalDays - 1; count++) {
+ offset++;
+ if (count % 7 == 0 || count % 7 == 1) {
+ Element rect = SVGUtilities.createRect(doc,
+ 200 + (offset - 1) * (width - 200) / (totalDays - 2),
+ (float)(topEdge + 0.5),
+ (width - 200) / (totalDays - 3),
+ height - 1 - topEdge);
+ rect.setAttributeNS(null, "style", "stroke:none;fill:rgb(230,230,230)");
+ svgRoot.appendChild(rect);
+ }
+ line = SVGUtilities.createLine(doc,
+ 200 + (offset - 1) * (width - 200) / (totalDays - 2),
+ (float)(topEdge + 0.5),
+ 200 + (offset - 1) * (width - 200) / (totalDays - 2),
+ (float)(height - 0.5));
+ line.setAttributeNS(null, "style", "fill:none;stroke:rgb(200,200,200)");
+ svgRoot.appendChild(line);
+ }
+
+
+ for (int count = 0; count < data.getSize(); count++) {
+ GroupInfo gi = data.getGroupInfo(count);
+ g = SVGUtilities.createG(doc);
+ text = SVGUtilities.createText(doc, 1, topEdge + 12,
+ gi.getName());
+ text.setAttributeNS(null, "style", "clip-path:url(#clip1)");
+ g.appendChild(text);
+ if (count > 0) {
+ line = SVGUtilities.createLine(doc, 0, topEdge + 2,
+ width, topEdge + 2);
+ line.setAttributeNS(null, "style", "fill:none;stroke:rgb(100,100,100)");
+ g.appendChild(line);
+ }
+
+ float lastTop = topEdge;
+ topEdge += 14;
+ boolean showing = false;
+ for (int count1 = 0; count1 < gi.getSize(); count1++) {
+ ActionInfo act = gi.getActionInfo(count1);
+ String name = act.getOwner();
+ String label = act.getLabel();
+ text = SVGUtilities.createText(doc, 8, topEdge + 12, label);
+ text.setAttributeNS(null, "style", "clip-path:url(#clip1)");
+ g.appendChild(text);
+
+ text = SVGUtilities.createText(doc, 130, topEdge + 12,
+ name);
+ text.setAttributeNS(null, "style", "clip-path:url(#clip2)");
+ g.appendChild(text);
+ int type = act.getType();
+ Date start = act.getStartDate();
+ Date end = act.getEndDate();
+ if (end.after(lastWeek) && start.before(future)) {
+ showing = true;
+ int left = 200;
+ int right = 500;
+
+ int daysToStart = (int)((start.getTime()
+ - lastWeek.getTime() + 43200000) / 86400000);
+ int days = (int)((end.getTime() - start.getTime()
+ + 43200000) / 86400000);
+ int daysFromEnd
+ = (int)((future.getTime() - end.getTime()
+ + 43200000) / 86400000);
+ Element taskGraphic;
+ switch (type) {
+ case ActionInfo.TASK:
+ taskGraphic = SVGUtilities.createRect(doc,
+ left + daysToStart * 300 / (totalDays - 2),
+ topEdge + 2, days * 300 / (totalDays - 2), 10);
+ taskGraphic.setAttributeNS(null,
+ "style",
+ "stroke:black;fill:blue;stroke-width:1;clip-path:url(#clip3)");
+ g.appendChild(taskGraphic);
+ break;
+ case ActionInfo.MILESTONE:
+ taskGraphic = SVGUtilities.createPath(doc,
+ "m " + (left
+ + daysToStart * 300 / (totalDays - 2) - 6)
+ + " " + (topEdge + 6) + "l6 6l6-6l-6-6z");
+ taskGraphic.setAttributeNS(null,
+ "style",
+ "stroke:black;fill:black;stroke-width:1;clip-path:url(#clip3)");
+ g.appendChild(taskGraphic);
+ text = SVGUtilities.createText(doc,
+ left + daysToStart * 300 / (totalDays - 2) + 8,
+ topEdge + 9, df.format(start));
+ g.appendChild(text);
+
+ break;
+ case ActionInfo.GROUPING:
+ taskGraphic = SVGUtilities.createPath(doc,
+ "m " + (left
+ + daysToStart * 300 / (totalDays - 2) - 6)
+ + " " + (topEdge + 6) + "l6 -6l"
+ + (days * 300 / (totalDays - 2))
+ + " 0l6 6l-6 6l-4-4l"
+ + -(days * 300 / (totalDays - 2) - 8)
+ + " 0l-4 4l-6-6z");
+ taskGraphic.setAttributeNS(null,
+ "style",
+ "stroke:black;fill:black;stroke-width:1;clip-path:url(#clip3)");
+ g.appendChild(taskGraphic);
+ break;
+ default:
+ break;
+ }
+ }
+
+ topEdge += 14;
+ }
+ if (showing) {
+ svgRoot.appendChild(g);
+ } else {
+ topEdge = lastTop;
+ }
+ }
+ int currentDays
+ = (int)((currentDate.getTime() - lastWeek.getTime()
+ + 43200000) / 86400000);
+
+ text = SVGUtilities.createText(doc,
+ (float)(200 + (currentDays + 0.5) * 300 / 35),
+ graphTop - 1, df.format(currentDate));
+ text.setAttributeNS(null, "text-anchor", "middle");
+ text.setAttributeNS(null, "style", "stroke:rgb(100,100,100)");
+ svgRoot.appendChild(text);
+
+ line = SVGUtilities.createLine(doc,
+ (float)(200 + (currentDays + 0.5) * 300 / 35), graphTop,
+ (float)(200 + (currentDays + 0.5) * 300 / 35), height);
+ line.setAttributeNS(null, "style", "fill:none;stroke:rgb(200,50,50);stroke-dasharray:5,5");
+ svgRoot.appendChild(line);
+
+
+ }
+}