aboutsummaryrefslogtreecommitdiffstats
path: root/examples/plan/src/org/apache/fop
diff options
context:
space:
mode:
authorJeremias Maerki <jeremias@apache.org>2003-01-29 16:35:07 +0000
committerJeremias Maerki <jeremias@apache.org>2003-01-29 16:35:07 +0000
commitc115738f9109affa0675fad62dd6ee321eee14ec (patch)
treea59ad3f14bb630d73bf5275e30612af6949260f2 /examples/plan/src/org/apache/fop
parente780db3a4e80ce4b8f445cd2748c8f3d32d419ce (diff)
downloadxmlgraphics-fop-c115738f9109affa0675fad62dd6ee321eee14ec.tar.gz
xmlgraphics-fop-c115738f9109affa0675fad62dd6ee321eee14ec.zip
Move over from contrib/plan
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@195910 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'examples/plan/src/org/apache/fop')
-rw-r--r--examples/plan/src/org/apache/fop/plan/ActionInfo.java65
-rw-r--r--examples/plan/src/org/apache/fop/plan/EventList.java25
-rw-r--r--examples/plan/src/org/apache/fop/plan/GroupInfo.java34
-rw-r--r--examples/plan/src/org/apache/fop/plan/Main.java67
-rw-r--r--examples/plan/src/org/apache/fop/plan/PlanDrawer.java16
-rw-r--r--examples/plan/src/org/apache/fop/plan/PlanElement.java69
-rw-r--r--examples/plan/src/org/apache/fop/plan/PlanElementMapping.java71
-rw-r--r--examples/plan/src/org/apache/fop/plan/PlanHints.java20
-rw-r--r--examples/plan/src/org/apache/fop/plan/PlanObj.java32
-rw-r--r--examples/plan/src/org/apache/fop/plan/PlanRenderer.java213
-rw-r--r--examples/plan/src/org/apache/fop/plan/SimplePlanDrawer.java283
11 files changed, 895 insertions, 0 deletions
diff --git a/examples/plan/src/org/apache/fop/plan/ActionInfo.java b/examples/plan/src/org/apache/fop/plan/ActionInfo.java
new file mode 100644
index 000000000..07cdde241
--- /dev/null
+++ b/examples/plan/src/org/apache/fop/plan/ActionInfo.java
@@ -0,0 +1,65 @@
+/* $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.plan;
+
+import java.util.Date;
+
+public class ActionInfo {
+ Date startDate;
+ Date endDate;
+ String owner;
+ String label;
+ int type = TASK;
+ public static final int TASK = 1;
+ public static final int MILESTONE = 2;
+ public static final int GROUPING = 3;
+ 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/examples/plan/src/org/apache/fop/plan/EventList.java b/examples/plan/src/org/apache/fop/plan/EventList.java
new file mode 100644
index 000000000..93418d9e1
--- /dev/null
+++ b/examples/plan/src/org/apache/fop/plan/EventList.java
@@ -0,0 +1,25 @@
+/* $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.plan;
+
+import java.util.ArrayList;
+
+public class EventList {
+ ArrayList data = new 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/examples/plan/src/org/apache/fop/plan/GroupInfo.java b/examples/plan/src/org/apache/fop/plan/GroupInfo.java
new file mode 100644
index 000000000..5223ff38c
--- /dev/null
+++ b/examples/plan/src/org/apache/fop/plan/GroupInfo.java
@@ -0,0 +1,34 @@
+/* $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.plan;
+
+import java.util.ArrayList;
+
+public class GroupInfo {
+ String name;
+ ArrayList actions = new 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/examples/plan/src/org/apache/fop/plan/Main.java b/examples/plan/src/org/apache/fop/plan/Main.java
new file mode 100644
index 000000000..cc2c12644
--- /dev/null
+++ b/examples/plan/src/org/apache/fop/plan/Main.java
@@ -0,0 +1,67 @@
+/* $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.plan;
+
+import java.io.*;
+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;
+
+public class Main {
+
+ public static void main(String[] args) {
+ Main main = new Main();
+ main.convert(args);
+ System.exit(0);
+ }
+
+ public Main() {
+ }
+
+ public void convert(String[] params) {
+ if (params.length != 2) {
+ System.out.println("arguments: plan.xml output.svg");
+ return;
+ }
+ try {
+ FileInputStream fis = new FileInputStream(params[0]);
+ Document doc = createSVGDocument(fis);
+ SVGTranscoder svgT = new SVGTranscoder();
+ TranscoderInput input = new TranscoderInput(doc);
+ Writer ostream = new FileWriter(params[1]);
+ TranscoderOutput output = new TranscoderOutput(ostream);
+ svgT.transcode(input, output);
+ ostream.flush();
+ ostream.close();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ 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/examples/plan/src/org/apache/fop/plan/PlanDrawer.java b/examples/plan/src/org/apache/fop/plan/PlanDrawer.java
new file mode 100644
index 000000000..62932af48
--- /dev/null
+++ b/examples/plan/src/org/apache/fop/plan/PlanDrawer.java
@@ -0,0 +1,16 @@
+/* $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.plan;
+
+import java.util.HashMap;
+
+import org.w3c.dom.Document;
+
+public interface PlanDrawer {
+ public Document createDocument(EventList data, float w, float h,
+ HashMap hints);
+}
diff --git a/examples/plan/src/org/apache/fop/plan/PlanElement.java b/examples/plan/src/org/apache/fop/plan/PlanElement.java
new file mode 100644
index 000000000..6d4aaa662
--- /dev/null
+++ b/examples/plan/src/org/apache/fop/plan/PlanElement.java
@@ -0,0 +1,69 @@
+/* $Id$
+ * Copyright (C) 2001-2002 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.plan;
+
+import java.awt.geom.Point2D;
+
+import org.apache.fop.fo.FONode;
+import org.apache.fop.apps.FOPException;
+
+import org.w3c.dom.Document;
+import org.xml.sax.Attributes;
+
+public class PlanElement extends PlanObj {
+ Document svgDoc = null;
+ float width;
+ float height;
+ boolean converted;
+
+ public PlanElement(FONode parent) {
+ super(parent);
+ }
+
+ public void handleAttrs(Attributes attlist) throws FOPException {
+ super.handleAttrs(attlist);
+ createBasicDocument();
+ }
+
+ 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;
+ }
+
+ }
+
+ public Document getDocument() {
+ convertToSVG();
+ return doc;
+ }
+
+ public String getDocumentNamespace() {
+ if(svgDoc == null) {
+ return PlanElementMapping.URI;
+ }
+ return "http://www.w3.org/2000/svg";
+ }
+
+ public Point2D getDimension(Point2D view) {
+ convertToSVG();
+ return new Point2D.Float(width, height);
+ }
+}
+
diff --git a/examples/plan/src/org/apache/fop/plan/PlanElementMapping.java b/examples/plan/src/org/apache/fop/plan/PlanElementMapping.java
new file mode 100644
index 000000000..721cdbd2c
--- /dev/null
+++ b/examples/plan/src/org/apache/fop/plan/PlanElementMapping.java
@@ -0,0 +1,71 @@
+/* $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.plan;
+
+import org.apache.fop.fo.FOTreeBuilder;
+import org.apache.fop.fo.FONode;
+import org.apache.fop.fo.ElementMapping;
+import org.apache.fop.image.analyser.XMLReader;
+import org.apache.fop.image.FopImage;
+import org.w3c.dom.Document;
+
+import java.util.HashMap;
+
+public class PlanElementMapping implements ElementMapping {
+
+ public static final String URI = "http://xml.apache.org/fop/plan";
+
+ private static HashMap foObjs = null;
+
+ private static synchronized void setupPlan() {
+ if (foObjs == null) {
+ foObjs = new HashMap();
+ foObjs.put("plan", new PE());
+ foObjs.put(DEFAULT, new PlanMaker());
+
+ XMLReader.setConverter(URI, new PlanConverter());
+ }
+ }
+
+ public void addToBuilder(FOTreeBuilder builder) {
+ setupPlan();
+ builder.addMapping(URI, foObjs);
+ }
+
+ 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);
+ }
+ }
+
+ static class PlanConverter implements XMLReader.Converter {
+ public FopImage.ImageInfo convert(Document doc) {
+ try {
+ PlanRenderer pr = new PlanRenderer();
+ pr.setFontInfo("Helvetica", 12);
+ FopImage.ImageInfo info = new FopImage.ImageInfo();
+ info.data = pr.createSVGDocument(doc);
+ info.width = (int)pr.getWidth();
+ info.height = (int)pr.getHeight();
+ info.mimeType = "image/svg+xml";
+ info.str = "http://www.w3.org/2000/svg";
+
+ return info;
+ } catch(Throwable t) {
+ }
+ return null;
+
+ }
+ }
+
+}
diff --git a/examples/plan/src/org/apache/fop/plan/PlanHints.java b/examples/plan/src/org/apache/fop/plan/PlanHints.java
new file mode 100644
index 000000000..1090cb48a
--- /dev/null
+++ b/examples/plan/src/org/apache/fop/plan/PlanHints.java
@@ -0,0 +1,20 @@
+/* $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.plan;
+
+public class PlanHints {
+ public static final String PLAN_BORDER = "border";
+ public static final String PLAN_LEGEND = "legend";
+ public static final String FONT_FAMILY = "font-family";
+ public static final String FONT_SIZE = "font-size";
+ public static final String LEGEND_TYPE = "legendType";
+ public static final String LOCALE = "locale";
+ public static final String LABEL_TYPE = "labelType";
+ public static final String LABEL_FONT_SIZE = "labelFontSize";
+ public static final String LABEL_FONT = "labelFont";
+
+}
diff --git a/examples/plan/src/org/apache/fop/plan/PlanObj.java b/examples/plan/src/org/apache/fop/plan/PlanObj.java
new file mode 100644
index 000000000..c2e46822e
--- /dev/null
+++ b/examples/plan/src/org/apache/fop/plan/PlanObj.java
@@ -0,0 +1,32 @@
+/* $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.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 {
+
+ /**
+ *
+ * @param parent the parent formatting object
+ */
+ public PlanObj(FONode parent) {
+ super(parent);
+ }
+
+ public String getNameSpace() {
+ return "http://xml.apache.org/fop/plan";
+ }
+}
+
diff --git a/examples/plan/src/org/apache/fop/plan/PlanRenderer.java b/examples/plan/src/org/apache/fop/plan/PlanRenderer.java
new file mode 100644
index 000000000..1aa3025ea
--- /dev/null
+++ b/examples/plan/src/org/apache/fop/plan/PlanRenderer.java
@@ -0,0 +1,213 @@
+/* $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.plan;
+
+import java.util.*;
+import java.text.*;
+import java.awt.*;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Rectangle2D;
+import java.awt.font.FontRenderContext;
+
+import org.w3c.dom.*;
+import org.w3c.dom.svg.*;
+import org.w3c.dom.css.*;
+
+import org.apache.batik.dom.svg.SVGDOMImplementation;
+
+public class PlanRenderer {
+ final static String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
+ String fontFamily = "sansserif";
+ float fontSize = 12;
+ private String type = "";
+ private String lang = "";
+ private String country = "";
+ private String variant = "";
+ float width;
+ float height;
+ float topEdge;
+ float rightEdge;
+ HashMap hints = new HashMap();
+
+ String[] colours;
+ String[] darkcolours;
+
+ public PlanRenderer() {
+ }
+
+ 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 {
+ }
+
+ 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/examples/plan/src/org/apache/fop/plan/SimplePlanDrawer.java b/examples/plan/src/org/apache/fop/plan/SimplePlanDrawer.java
new file mode 100644
index 000000000..237a58749
--- /dev/null
+++ b/examples/plan/src/org/apache/fop/plan/SimplePlanDrawer.java
@@ -0,0 +1,283 @@
+/* $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.plan;
+
+import org.apache.fop.svg.SVGUtilities;
+
+import java.util.*;
+import java.text.*;
+import java.awt.*;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Rectangle2D;
+import java.awt.font.FontRenderContext;
+
+import org.w3c.dom.*;
+import org.w3c.dom.svg.*;
+import org.w3c.dom.css.*;
+
+import org.apache.batik.dom.svg.SVGDOMImplementation;
+
+public class SimplePlanDrawer implements PlanDrawer {
+ final static String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
+ float fontSize;
+ HashMap hints;
+ java.awt.Font font = null;
+ boolean bord = false;
+ float lSpace = 15;
+ float width;
+ float height;
+ float topEdge;
+ float rightEdge;
+
+ String[] colours;
+ String[] darkcolours;
+
+ Date startDate;
+ Date endDate;
+
+ public void setStartDate(Date sd) {
+ startDate = sd;
+ }
+
+ public void setEndDate(Date ed) {
+ endDate = ed;
+ }
+
+ 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(svgNS, "svg", null);
+
+ Element svgRoot = doc.getDocumentElement();
+ svgRoot.setAttributeNS(null, "width", "" + width);
+ svgRoot.setAttributeNS(null, "height", "" + 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);
+
+
+ }
+}