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;