diff --git a/ganttzk/pom.xml b/ganttzk/pom.xml
index ad3b819a9..cc30e4f1b 100644
--- a/ganttzk/pom.xml
+++ b/ganttzk/pom.xml
@@ -91,6 +91,18 @@
easymockclassextension
test
+
+ jfree
+ jfreechart
+
+
+ jfree
+ jcommon
+
+
+ jfree
+ jfreechart-igalia
+
diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java b/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java
index dc700ae90..650d2838c 100644
--- a/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java
+++ b/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java
@@ -37,6 +37,7 @@ import org.zkoss.ganttz.data.GanttDiagramGraph.IGraphChangeListener;
import org.zkoss.ganttz.extensions.ICommand;
import org.zkoss.ganttz.extensions.ICommandOnTask;
import org.zkoss.ganttz.extensions.IContext;
+import org.zkoss.ganttz.print.Print;
import org.zkoss.ganttz.timetracker.TimeTracker;
import org.zkoss.ganttz.timetracker.TimeTrackerComponent;
import org.zkoss.ganttz.timetracker.TimeTrackerComponentWithoutColumns;
@@ -359,4 +360,8 @@ public class Planner extends HtmlMacroComponent {
}
}
+ public void print() {
+ Print.print(diagramGraph);
+ }
+
}
diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/print/Print.java b/ganttzk/src/main/java/org/zkoss/ganttz/print/Print.java
new file mode 100644
index 000000000..e217921cc
--- /dev/null
+++ b/ganttzk/src/main/java/org/zkoss/ganttz/print/Print.java
@@ -0,0 +1,160 @@
+package org.zkoss.ganttz.print;
+
+import gantt.builder.ChartBuilder;
+import gantt.builder.DatasetBuilder;
+import gantt.data.ExtendedGanttCategoryDataset;
+import gantt.data.ExtendedTaskSeriesCollection;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+
+import org.jfree.chart.ChartUtilities;
+import org.jfree.chart.JFreeChart;
+import org.jfree.data.gantt.TaskSeries;
+import org.zkoss.ganttz.data.GanttDiagramGraph;
+import org.zkoss.ganttz.data.Task;
+import org.zkoss.ganttz.timetracker.zoom.ZoomLevel;
+
+public class Print {
+
+ private static final int INTERVAL_LENGTH_IN_MINUTES = 300 * 24 * 30;
+ private static final String DEFAULT_SERIES_NAME = "Scheduled";
+ private static final long serialVersionUID = 1L;
+
+ public static void print(GanttDiagramGraph diagramGraph) {
+ try {
+ printGanttHorizontalPagingDemo(diagramGraph);
+ } catch (Exception e) {
+ throw new RuntimeException(e.getMessage());
+ }
+ }
+
+ public static void printGanttHorizontalPagingDemo(GanttDiagramGraph diagramGraph) throws Exception {
+ int i = 0;
+ DatasetBuilder datasetBuilder = new DatasetBuilder();
+
+ final List tasks = diagramGraph.getTasks();
+ final Date begin = getSmallestBeginDate(tasks);
+ final Date end = getBiggestFinishDate(tasks);
+
+ // Create series
+ List taskSeriesList = new ArrayList();
+ final TaskSeries taskSeries = datasetBuilder.createTaskSeries(diagramGraph,
+ DEFAULT_SERIES_NAME);
+ taskSeriesList.add(taskSeries);
+
+ // Create dataset and split it
+ final ExtendedGanttCategoryDataset dataset = datasetBuilder
+ .createDataset(taskSeriesList);
+
+ List subdatasets = datasetBuilder
+ .splitDatasetInIntervals(dataset, begin, end,
+ INTERVAL_LENGTH_IN_MINUTES);
+
+ // Create a chart for each subdataset
+ for (ExtendedGanttCategoryDataset each : subdatasets) {
+ final JFreeChart chart = createChart(each);
+ final String filename = "PAGE-" + i;
+ saveChartAsPNG(chart, filename);
+ i++;
+ }
+ }
+
+ private static JFreeChart createChart(ExtendedGanttCategoryDataset dataset) {
+ final ChartBuilder chartBuilder = new ChartBuilder();
+ return chartBuilder.createChart("Gantt Diagram",
+ "Tasks", "Date", dataset, true, true, false, ZoomLevel.DETAIL_TWO);
+ }
+
+ private static void saveChartAsPNG(JFreeChart chart, String filename) {
+ try {
+ final File file = new File(filename + ".png");
+ ChartUtilities.saveChartAsPNG(file, chart, 600, 600);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private static Date getSmallestBeginDate(
+ List tasks) {
+ if (tasks.isEmpty())
+ return Calendar.getInstance().getTime();
+ return getSmallest(getStartDates(tasks));
+ }
+
+ private static Date getBiggestFinishDate(
+ List tasks) {
+ if (tasks.isEmpty())
+ return Calendar.getInstance().getTime();
+ return getBiggest(getEndDates(tasks));
+ }
+
+ private static List getStartDates(
+ List tasks) {
+ ArrayList result = new ArrayList();
+ for (org.zkoss.ganttz.data.Task t : tasks) {
+ result.add(t.getBeginDate());
+ }
+ return result;
+ }
+
+ private static List getEndDates(List tasks) {
+ ArrayList result = new ArrayList();
+ for (org.zkoss.ganttz.data.Task t : tasks) {
+ result.add(t.getEndDate());
+ }
+ return result;
+ }
+
+ private static > T getSmallest(
+ Collection elements) {
+ return getSmallest(elements, new Comparator() {
+
+ @Override
+ public int compare(T o1, T o2) {
+ return o1.compareTo(o2);
+ }
+ });
+ }
+
+ private static > T getBiggest(
+ Collection elements) {
+ return getSmallest(elements, new Comparator() {
+
+ @Override
+ public int compare(T o1, T o2) {
+ return o2.compareTo(o1);
+ }
+ });
+ }
+
+ private static T getSmallest(Collection elements,
+ Comparator comparator) {
+ List withoutNulls = removeNulls(elements);
+ if (withoutNulls.isEmpty())
+ throw new IllegalArgumentException("at least one required");
+ T result = null;
+ for (T element : withoutNulls) {
+ result = result == null ? element : (comparator.compare(result,
+ element) < 0 ? result : element);
+ }
+ return result;
+ }
+
+ private static List removeNulls(Collection elements) {
+ ArrayList result = new ArrayList();
+ for (T e : elements) {
+ if (e != null) {
+ result.add(e);
+ }
+ }
+ return result;
+ }
+
+}
diff --git a/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul b/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul
index d24c54c02..232a69fd0 100644
--- a/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul
+++ b/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul
@@ -34,6 +34,9 @@ planner = self;
+
+
diff --git a/navalplanner-webapp/pom.xml b/navalplanner-webapp/pom.xml
index e1f8ba15e..8a3f26973 100644
--- a/navalplanner-webapp/pom.xml
+++ b/navalplanner-webapp/pom.xml
@@ -94,6 +94,10 @@
jfree
jcommon
+
+ jfree
+ jfreechart-igalia
+
commons-fileupload
diff --git a/pom.xml b/pom.xml
index c33edbeb2..6892d5b18 100644
--- a/pom.xml
+++ b/pom.xml
@@ -408,6 +408,11 @@
jcommon
1.0.16
+
+ jfree
+ jfreechart-igalia
+ 0.0.1
+
joda-time