diff -Naur jasperreports-1.3.1/demo/hsqldb/test.script jasperreports-1.3.1_gantted/demo/hsqldb/test.script
--- jasperreports-1.3.1/demo/hsqldb/test.script	2005-12-02 17:07:32.000000000 +0000
+++ jasperreports-1.3.1_gantted/demo/hsqldb/test.script	2007-02-28 00:41:37.000000000 +0000
@@ -3,6 +3,7 @@
 CREATE TABLE DOCUMENT(ID INTEGER PRIMARY KEY,ADDRESSID INTEGER,TOTAL DECIMAL)
 CREATE TABLE POSITIONS(DOCUMENTID INTEGER,POSITIONNO INTEGER,PRODUCTID INTEGER,QUANTITY INTEGER,PRICE DECIMAL,UNIQUE(DOCUMENTID,POSITIONNO))
 CREATE TABLE ORDERS(ORDERID INTEGER,CUSTOMERID VARCHAR,EMPLOYEEID INTEGER,ORDERDATE TIMESTAMP,REQUIREDDATE TIMESTAMP,SHIPPEDDATE TIMESTAMP,SHIPVIA INTEGER,FREIGHT NUMERIC,SHIPNAME VARCHAR,SHIPADDRESS VARCHAR,SHIPCITY VARCHAR,SHIPREGION VARCHAR,SHIPPOSTALCODE VARCHAR,SHIPCOUNTRY VARCHAR)
+CREATE TABLE TASKS(TASK VARCHAR,SUBTASK VARCHAR,STARTTIMESTAMP TIMESTAMP,ENDTIMESTAMP TIMESTAMP)
 GRANT ALL ON CLASS "org.hsqldb.Library" TO PUBLIC
 GRANT ALL ON CLASS "java.lang.Math" TO PUBLIC
 CREATE USER SA PASSWORD "" ADMIN
@@ -1701,5 +1702,13 @@
 INSERT INTO ORDERS VALUES(11075,'RICSU',8,'1998-05-06 00:00:00.0','1998-06-03 00:00:00.0',NULL,2,6.19,'Richter Supermarkt','Starenweg 5','Gen\u00e8ve',NULL,'1204','Switzerland')
 INSERT INTO ORDERS VALUES(11076,'BONAP',4,'1998-05-06 00:00:00.0','1998-06-03 00:00:00.0',NULL,2,38.28,'Bon app''','12, rue des Bouchers','Marseille',NULL,'13008','France')
 INSERT INTO ORDERS VALUES(11077,'RATTC',1,'1998-05-06 00:00:00.0','1998-06-03 00:00:00.0',NULL,2,8.53,'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque','NM','87110','USA')
+INSERT INTO TASKS VALUES('TASK1','SUBTASK1','1998-05-06 00:00:00.0','1998-05-07 00:00:00.0')
+INSERT INTO TASKS VALUES('TASK1','SUBTASK2','1998-05-01 00:00:00.0','1998-05-02 00:00:00.0')
+INSERT INTO TASKS VALUES('TASK1','SUBTASK3','1998-05-03 00:00:00.0','1998-05-05 00:00:00.0')
+INSERT INTO TASKS VALUES('TASK1','SUBTASK4','1998-05-11 00:00:00.0','1998-05-15 00:00:00.0')
+INSERT INTO TASKS VALUES('TASK2','SUBTASK1','1998-05-06 00:00:00.0','1998-05-08 00:00:00.0')
+INSERT INTO TASKS VALUES('TASK2','SUBTASK1','1998-05-08 06:00:00.0','1998-05-09 00:00:00.0')
+INSERT INTO TASKS VALUES('TASK2','SUBTASK1','1998-05-10 00:00:00.0','1998-05-15 00:00:00.0')
+INSERT INTO TASKS VALUES('TASK3','SUBTASK1','1998-05-07 00:00:00.0','1998-05-08 00:00:00.0')
 /*C1*/CONNECT USER sa PASSWORD ""
 /*C2*/CONNECT USER sa PASSWORD ""
diff -Naur jasperreports-1.3.1/demo/samples/charts/ChartsApp.java jasperreports-1.3.1_gantted/demo/samples/charts/ChartsApp.java
--- jasperreports-1.3.1/demo/samples/charts/ChartsApp.java	2007-02-09 11:11:04.000000000 +0000
+++ jasperreports-1.3.1_gantted/demo/samples/charts/ChartsApp.java	2007-02-28 00:43:15.000000000 +0000
@@ -83,7 +83,8 @@
 		"ThermometerChartReport",
 		"HighLowChartReport",
 		"CandlestickChartReport",
-		"StackedAreaChartReport"
+		"StackedAreaChartReport",
+		"GanttChartReport"
 		};
 	
 	/**
diff -Naur jasperreports-1.3.1/demo/samples/charts/GanttChartReport.jrxml jasperreports-1.3.1_gantted/demo/samples/charts/GanttChartReport.jrxml
--- jasperreports-1.3.1/demo/samples/charts/GanttChartReport.jrxml	1970-01-01 00:00:00.000000000 +0000
+++ jasperreports-1.3.1_gantted/demo/samples/charts/GanttChartReport.jrxml	2007-02-28 00:30:40.000000000 +0000
@@ -0,0 +1,409 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE jasperReport PUBLIC "-//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
+
+<jasperReport name="GanttChartReport" language="java" columnCount="2" pageWidth="595" pageHeight="842" columnWidth="270" columnSpacing="15" leftMargin="20" rightMargin="20" topMargin="30" bottomMargin="30">
+<!-- -->
+	<style name="Arial_Normal" isDefault="true" fontName="Arial" fontSize="8" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false" pdfFontName="Helvetica" pdfEncoding="Cp1252" isPdfEmbedded="false"/>
+	<style name="Arial_Bold" isDefault="false" fontName="Arial" fontSize="8" isBold="true" isItalic="false" isUnderline="false" isStrikeThrough="false" pdfFontName="Helvetica-Bold" pdfEncoding="Cp1252" isPdfEmbedded="false"/>
+	<style name="Arial_Italic" isDefault="false" fontName="Arial" fontSize="8" isBold="false" isItalic="true" isUnderline="false" isStrikeThrough="false" pdfFontName="Helvetica-Oblique" pdfEncoding="Cp1252" isPdfEmbedded="false"/>
+	<style name="Comic_Normal" isDefault="false" fontName="Comic Sans MS" fontSize="10" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false" pdfFontName="COMIC.TTF" pdfEncoding="Identity-H" isPdfEmbedded="true"/>
+	<style name="Comic_Bold" isDefault="false" fontName="Comic Sans MS" fontSize="10" isBold="true" isItalic="false" isUnderline="false" isStrikeThrough="false" pdfFontName="COMICBD.TTF" pdfEncoding="Identity-H" isPdfEmbedded="true"/>
+<!-- -->
+<!--
+	<parameter name="ReportTitle" class="java.lang.String">
+	</parameter>
+	<parameter name="MaxOrderID" class="java.lang.Integer">
+	</parameter>
+-->
+
+	<queryString><![CDATA[SELECT Task,Subtask,StartTimestamp,EndTimestamp FROM Tasks]]></queryString>
+<!--
+	<queryString><![CDATA[SELECT * FROM Orders ORDER BY ShipCountry]]></queryString>
+-->
+	<field name="Task" class="java.lang.String">
+	</field>
+	<field name="Subtask" class="java.lang.String">
+	</field>
+	<field name="StartTimestamp" class="java.sql.Timestamp">
+	</field>
+	<field name="EndTimestamp" class="java.sql.Timestamp">
+	</field>
+<!--
+<field name="Freight" class="java.lang.Double"/>
+<field name="OrderID" class="java.lang.Integer"/>
+-->
+
+<!--
+	<variable name="FirstLetter" class="java.lang.String" resetType="None">
+		<variableExpression><![CDATA[$F{ShipCountry}.substring(0, 1).toUpperCase()]]></variableExpression>
+	</variable>
+	<variable name="FreightSumFirstLetterGroup" class="java.lang.Double" resetType="Group" resetGroup="FirstLetterGroup" calculation="Sum">
+		<variableExpression><![CDATA[$F{Freight}]]></variableExpression>
+	</variable>
+	<variable name="FreightSumCountryGroup" class="java.lang.Double" resetType="Group" resetGroup="CountryGroup" calculation="Sum">
+		<variableExpression><![CDATA[$F{Freight}]]></variableExpression>
+	</variable>
+	<variable name="FreightSumColumn" class="java.lang.Double" resetType="Column" calculation="Sum">
+		<variableExpression><![CDATA[$F{Freight}]]></variableExpression>
+	</variable>
+	<variable name="FreightSumPage" class="java.lang.Double" resetType="Page" calculation="Sum">
+		<variableExpression><![CDATA[$F{Freight}]]></variableExpression>
+	</variable>
+	<variable name="FreightSumReport" class="java.lang.Double" calculation="Sum">
+		<variableExpression><![CDATA[$F{Freight}]]></variableExpression>
+	</variable>
+	<variable name="DateHighestCountryGroup" class="java.sql.Timestamp" resetType="Group" resetGroup="CountryGroup" calculation="Highest">
+		<variableExpression><![CDATA[$F{OrderDate}]]></variableExpression>
+	</variable>
+	<variable name="RegionCountCountryGroup" class="java.lang.Integer" resetType="Group" resetGroup="CountryGroup" calculation="Count">
+		<variableExpression><![CDATA[$F{ShipRegion}]]></variableExpression>
+	</variable>
+-->
+<!--
+	<group name="FirstLetterGroup" isStartNewColumn="true" isReprintHeaderOnEachPage="false" minHeightToStartNewPage="200">
+		<groupExpression><![CDATA[$V{FirstLetter}]]></groupExpression>
+		<groupHeader>
+		<band height="25">
+			<rectangle>
+				<reportElement x="0" y="14" width="270" height="11" forecolor="#ffdddd" backcolor="#ffdddd"/>
+				<graphicElement/>
+			</rectangle>
+			<staticText>
+				<reportElement style="Arial_Italic" mode="Opaque" x="0" y="14" width="120" height="11" forecolor="#ff0000" backcolor="#ffdddd"/>
+				<textElement>
+					<font isUnderline="true"/>
+				</textElement>
+				<text><![CDATA[Countries Starting With Letter :]]></text>
+			</staticText>
+			<textField>
+				<reportElement style="Arial_Bold" mode="Opaque" x="120" y="14" width="150" height="11" forecolor="#ff0000" backcolor="#ffdddd"/>
+				<textElement>
+					<font/>
+				</textElement>
+				<textFieldExpression class="java.lang.String"><![CDATA[$V{FirstLetter}]]></textFieldExpression>
+			</textField>
+		</band>
+		</groupHeader>
+		<groupFooter>
+		<band height="25">
+			<line>
+				<reportElement x="0" y="0" width="270" height="1" forecolor="#ff0000"/>
+				<graphicElement/>
+			</line>
+			<staticText>
+				<reportElement style="Arial_Bold" x="0" y="1" width="45" height="11" forecolor="#ff0000"/>
+				<textElement textAlignment="Right">
+					<font/>
+				</textElement>
+				<text><![CDATA[Count :]]></text>
+			</staticText>
+			<textField>
+				<reportElement style="Arial_Bold" x="45" y="1" width="25" height="11" forecolor="#ff0000"/>
+				<textElement textAlignment="Right">
+					<font/>
+				</textElement>
+				<textFieldExpression class="java.lang.Integer"><![CDATA[$V{FirstLetterGroup_COUNT}]]></textFieldExpression>
+			</textField>
+			<staticText>
+				<reportElement style="Arial_Bold" x="70" y="1" width="140" height="11" forecolor="#ff0000"/>
+				<textElement textAlignment="Right">
+					<font/>
+				</textElement>
+				<text><![CDATA[Total :]]></text>
+			</staticText>
+			<textField pattern="0.00">
+				<reportElement style="Arial_Bold" x="210" y="1" width="60" height="11" forecolor="#ff0000"/>
+				<textElement textAlignment="Right">
+					<font/>
+				</textElement>
+				<textFieldExpression class="java.lang.Double"><![CDATA[$V{FreightSumFirstLetterGroup}]]></textFieldExpression>
+			</textField>
+		</band>
+		</groupFooter>
+	</group>
+	<group name="CountryGroup" isReprintHeaderOnEachPage="false">
+		<groupExpression><![CDATA[$F{ShipCountry}]]></groupExpression>
+		<groupHeader>
+		<band height="200">
+			<line>
+				<reportElement x="0" y="14" width="270" height="1"/>
+				<graphicElement/>
+			</line>
+			<textField>
+				<reportElement style="Arial_Bold" x="10" y="2" width="100" height="11"/>
+				<textElement>
+					<font/>
+				</textElement>
+				<textFieldExpression class="java.lang.String"><![CDATA[$F{ShipCountry}]]></textFieldExpression>
+			</textField>
+			<textField evaluationTime="Group" evaluationGroup="CountryGroup" pattern="EEE, MMM d, yyyy">
+				<reportElement style="Arial_Bold" x="170" y="2" width="100" height="11"/>
+				<textElement textAlignment="Right">
+					<font/>
+				</textElement>
+				<textFieldExpression class="java.sql.Timestamp"><![CDATA[$V{DateHighestCountryGroup}]]></textFieldExpression>
+			</textField>
+			<xyLineChart>
+				<chart evaluationTime="Group" evaluationGroup="CountryGroup">
+					<reportElement positionType="Float" x="0" y="25" width="270" height="175"/>
+				</chart>
+				<xyDataset>
+					<dataset resetType="Group" resetGroup="CountryGroup"/>
+					<xySeries>
+						<seriesExpression>"Freight"</seriesExpression>
+						<xValueExpression>$F{OrderID}</xValueExpression>
+						<yValueExpression>$F{Freight}</yValueExpression>
+					</xySeries>
+					<xySeries>
+						<seriesExpression>"Half Freight"</seriesExpression>
+						<xValueExpression>$F{OrderID}</xValueExpression>
+						<yValueExpression>new Double($F{Freight}.doubleValue() / 2d)</yValueExpression>
+					</xySeries>
+				</xyDataset>
+				<linePlot isShowLines="true" isShowShapes="false">
+					<plot/>
+				</linePlot>
+			</xyLineChart>
+		</band>
+		</groupHeader>
+		<groupFooter>
+		<band height="15">
+			<rectangle>
+				<reportElement x="0" y="0" width="270" height="11" forecolor="#c0c0c0" backcolor="#c0c0c0"/>
+				<graphicElement/>
+			</rectangle>
+			<staticText>
+				<reportElement style="Arial_Bold" mode="Opaque" x="0" y="0" width="45" height="11" backcolor="#c0c0c0"/>
+				<textElement textAlignment="Right">
+					<font/>
+				</textElement>
+				<text><![CDATA[Count :]]></text>
+			</staticText>
+			<textField>
+				<reportElement style="Arial_Bold" mode="Opaque" x="45" y="0" width="25" height="11" backcolor="#c0c0c0"/>
+				<textElement textAlignment="Right">
+					<font/>
+				</textElement>
+				<textFieldExpression class="java.lang.Integer"><![CDATA[$V{CountryGroup_COUNT}]]></textFieldExpression>
+			</textField>
+			<staticText>
+				<reportElement style="Arial_Bold" mode="Opaque" x="70" y="0" width="140" height="11" backcolor="#c0c0c0"/>
+				<textElement textAlignment="Right">
+					<font/>
+				</textElement>
+				<text><![CDATA[Total :]]></text>
+			</staticText>
+			<textField pattern="0.00">
+				<reportElement style="Arial_Bold" mode="Opaque" x="210" y="0" width="60" height="11" backcolor="#c0c0c0"/>
+				<textElement textAlignment="Right">
+					<font/>
+				</textElement>
+				<textFieldExpression class="java.lang.Double"><![CDATA[$V{FreightSumCountryGroup}]]></textFieldExpression>
+			</textField>
+		</band>
+		</groupFooter>
+	</group>
+	<title>
+		<band height="50">
+			<elementGroup>
+			</elementGroup>
+			<staticText>
+				<reportElement style="Comic_Bold" x="0" y="0" width="555" height="35"/>
+				<box topBorder="Thin" leftBorder="None" bottomBorder="None" rightBorder="None"/>
+				<textElement textAlignment="Center">
+					<font size="22"/>
+				</textElement>
+				<text><![CDATA[XY Line Chart Report]]></text>
+			</staticText>
+		</band>
+	</title>
+	<columnHeader>
+		<band height="11">
+			<rectangle>
+				<reportElement x="0" y="0" width="270" height="11" backcolor="#333333"/>
+				<graphicElement/>
+			</rectangle>
+			<staticText>
+				<reportElement style="Arial_Bold" mode="Opaque" x="0" y="0" width="40" height="11" forecolor="#ffffff" backcolor="#333333"/>
+				<textElement textAlignment="Center">
+					<font/>
+				</textElement>
+				<text><![CDATA[Order]]></text>
+			</staticText>
+			<staticText>
+				<reportElement style="Arial_Bold" mode="Opaque" x="40" y="0" width="145" height="11" forecolor="#ffffff" backcolor="#333333"/>
+				<textElement textAlignment="Center">
+					<font/>
+				</textElement>
+				<text><![CDATA[Name, City]]></text>
+			</staticText>
+			<staticText>
+				<reportElement style="Arial_Bold" mode="Opaque" x="185" y="0" width="50" height="11" forecolor="#ffffff" backcolor="#333333"/>
+				<textElement>
+					<font/>
+				</textElement>
+				<text><![CDATA[Date]]></text>
+			</staticText>
+			<staticText>
+				<reportElement style="Arial_Bold" mode="Opaque" x="235" y="0" width="35" height="11" forecolor="#ffffff" backcolor="#333333"/>
+				<textElement textAlignment="Right">
+					<font/>
+				</textElement>
+				<text><![CDATA[Freight]]></text>
+			</staticText>
+		</band>
+	</columnHeader>
+	<detail>
+		<band height="13">
+			<textField>
+				<reportElement x="1" y="0" width="35" height="11"/>
+				<textElement textAlignment="Right"/>
+				<textFieldExpression class="java.lang.Integer"><![CDATA[$F{OrderID}]]></textFieldExpression>
+			</textField>
+			<textField isStretchWithOverflow="true">
+				<reportElement positionType="Float" x="40" y="0" width="110" height="11"/>
+				<textElement/>
+				<textFieldExpression class="java.lang.String"><![CDATA[$F{ShipName} + ", " + $F{ShipCity}]]></textFieldExpression>
+			</textField>
+			<textField isBlankWhenNull="true">
+				<reportElement x="155" y="0" width="25" height="11"/>
+				<textElement/>
+				<textFieldExpression class="java.lang.String"><![CDATA[$F{ShipRegion}]]></textFieldExpression>
+			</textField>
+			<textField pattern="dd/MM/yyyy">
+				<reportElement x="185" y="0" width="50" height="11"/>
+				<textElement/>
+				<textFieldExpression class="java.sql.Timestamp"><![CDATA[$F{OrderDate}]]></textFieldExpression>
+			</textField>
+			<textField pattern="0.00">
+				<reportElement x="235" y="0" width="35" height="11"/>
+				<textElement textAlignment="Right"/>
+				<textFieldExpression class="java.lang.Double"><![CDATA[$F{Freight}]]></textFieldExpression>
+			</textField>
+			<line>
+				<reportElement positionType="Float" x="0" y="12" width="270" height="1" forecolor="#808080"/>
+				<graphicElement pen="Thin"/>
+			</line>
+		</band>
+	</detail>
+	<columnFooter>
+		<band height="11">
+			<rectangle>
+				<reportElement x="0" y="0" width="270" height="11" backcolor="#333333"/>
+				<graphicElement/>
+			</rectangle>
+			<staticText>
+				<reportElement style="Arial_Bold" mode="Opaque" x="0" y="0" width="45" height="11" forecolor="#ffffff" backcolor="#333333"/>
+				<textElement textAlignment="Right">
+					<font/>
+				</textElement>
+				<text><![CDATA[Count :]]></text>
+			</staticText>
+			<textField>
+				<reportElement style="Arial_Bold" mode="Opaque" x="45" y="0" width="25" height="11" forecolor="#ffffff" backcolor="#333333"/>
+				<textElement textAlignment="Right">
+					<font/>
+				</textElement>
+				<textFieldExpression class="java.lang.Integer"><![CDATA[$V{COLUMN_COUNT}]]></textFieldExpression>
+			</textField>
+			<staticText>
+				<reportElement style="Arial_Bold" mode="Opaque" x="70" y="0" width="140" height="11" forecolor="#ffffff" backcolor="#333333"/>
+				<textElement textAlignment="Right">
+					<font/>
+				</textElement>
+				<text><![CDATA[Total :]]></text>
+			</staticText>
+			<textField pattern="0.00">
+				<reportElement style="Arial_Bold" mode="Opaque" x="210" y="0" width="60" height="11" forecolor="#ffffff" backcolor="#333333"/>
+				<textElement textAlignment="Right">
+					<font/>
+				</textElement>
+				<textFieldExpression class="java.lang.Double"><![CDATA[$V{FreightSumColumn}]]></textFieldExpression>
+			</textField>
+		</band>
+	</columnFooter>
+	<pageFooter>
+		<band height="30">
+			<rectangle>
+				<reportElement mode="Transparent" x="0" y="5" width="555" height="25"/>
+				<graphicElement/>
+			</rectangle>
+			<staticText>
+				<reportElement x="5" y="10" width="50" height="20"/>
+				<textElement textAlignment="Right">
+					<font size="14"/>
+				</textElement>
+				<text><![CDATA[Count :]]></text>
+			</staticText>
+			<textField>
+				<reportElement x="55" y="10" width="45" height="20"/>
+				<textElement textAlignment="Right">
+					<font size="14"/>
+				</textElement>
+				<textFieldExpression class="java.lang.Integer"><![CDATA[$V{PAGE_COUNT}]]></textFieldExpression>
+			</textField>
+			<staticText>
+				<reportElement x="430" y="10" width="50" height="20"/>
+				<textElement textAlignment="Right">
+					<font size="14"/>
+				</textElement>
+				<text><![CDATA[Total :]]></text>
+			</staticText>
+			<textField pattern="0.00">
+				<reportElement x="480" y="10" width="70" height="20"/>
+				<textElement textAlignment="Right">
+					<font size="14"/>
+				</textElement>
+				<textFieldExpression class="java.lang.Double"><![CDATA[$V{FreightSumPage}]]></textFieldExpression>
+			</textField>
+			<textField>
+				<reportElement x="200" y="10" width="75" height="20"/>
+				<textElement textAlignment="Right">
+					<font size="14"/>
+				</textElement>
+				<textFieldExpression class="java.lang.Integer"><![CDATA[$V{PAGE_NUMBER}]]></textFieldExpression>
+			</textField>
+			<staticText>
+				<reportElement x="275" y="10" width="5" height="20"/>
+				<textElement textAlignment="Center">
+					<font size="14"/>
+				</textElement>
+				<text><![CDATA[/]]></text>
+			</staticText>
+			<textField evaluationTime="Report">
+				<reportElement x="280" y="10" width="75" height="20"/>
+				<textElement>
+					<font size="14"/>
+				</textElement>
+				<textFieldExpression class="java.lang.Integer"><![CDATA[$V{PAGE_NUMBER}]]></textFieldExpression>
+			</textField>
+		</band>
+	</pageFooter>
+	-->
+	<summary>
+<!-- -->
+		<band height="200">
+			<ganttChart>
+<!--				<chart evaluationTime="Group" evaluationGroup="CountryGroup">-->
+				<chart>
+					<reportElement positionType="Float" x="0" y="25" width="270" height="175"/>
+				</chart>
+				<ganttDataset>
+<!--					<dataset resetType="Group" resetGroup="CountryGroup"/>-->
+					<dataset/>
+					<ganttSeries>
+						<seriesExpression>"this would be the series expression"</seriesExpression>
+						<taskValueExpression>$F{Task}</taskValueExpression>
+						<subtaskValueExpression>$F{Subtask}</subtaskValueExpression>
+						<startDateExpression>$F{StartTimestamp}</startDateExpression>
+						<endDateExpression>$F{EndTimestamp}</endDateExpression>
+					</ganttSeries>
+				</ganttDataset>
+				<barPlot>
+					<plot/>
+				</barPlot>
+			</ganttChart>
+<!-- -->
+		</band>
+	</summary>
+</jasperReport>
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/charts/JRGanttDataset.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/JRGanttDataset.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/charts/JRGanttDataset.java	1970-01-01 00:00:00.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/JRGanttDataset.java	2007-02-28 00:55:47.000000000 +0000
@@ -0,0 +1,16 @@
+package net.sf.jasperreports.charts;
+
+import net.sf.jasperreports.engine.JRChartDataset;
+
+/**
+ * @author Peter Risko (peter@risko.hu)
+ */
+public interface JRGanttDataset extends JRChartDataset {
+ 
+    /**
+     * 
+     */
+    public JRGanttSeries[] getSeries();
+
+
+}
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/charts/JRGanttSeries.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/JRGanttSeries.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/charts/JRGanttSeries.java	1970-01-01 00:00:00.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/JRGanttSeries.java	2007-02-28 00:55:47.000000000 +0000
@@ -0,0 +1,53 @@
+package net.sf.jasperreports.charts;
+
+import net.sf.jasperreports.engine.JRChartDataset;
+import net.sf.jasperreports.engine.JRExpression;
+import net.sf.jasperreports.engine.JRHyperlink;
+
+/**
+ * @author Peter Risko (peter@risko.hu)
+ */
+public interface JRGanttSeries {
+
+    /**
+     * 
+     */
+    public JRExpression getSeriesExpression();
+
+    /**
+     * 
+     */
+    public JRExpression getTaskValueExpression();
+    
+    /**
+     * 
+     */
+    public JRExpression getSubtaskValueExpression();
+    
+    /**
+     * 
+     */
+    public JRExpression getStartDateExpression();
+
+    /**
+     * 
+     */
+    public JRExpression getEndDateExpression();
+
+    /**
+     * 
+     */
+    public JRExpression getLabelExpression();
+
+    
+    /**
+     * Returns the hyperlink specification for chart items.
+     * <p>
+     * The hyperlink will be evaluated for every chart item and a image map will be created for the chart.
+     * </p>
+     * 
+     * @return hyperlink specification for chart items
+     */
+    public JRHyperlink getItemHyperlink();
+
+}
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/charts/base/JRBaseGanttDataset.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/base/JRBaseGanttDataset.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/charts/base/JRBaseGanttDataset.java	1970-01-01 00:00:00.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/base/JRBaseGanttDataset.java	2007-02-28 00:55:47.000000000 +0000
@@ -0,0 +1,86 @@
+package net.sf.jasperreports.charts.base;
+
+import net.sf.jasperreports.charts.JRGanttDataset;
+import net.sf.jasperreports.charts.JRGanttSeries;
+import net.sf.jasperreports.charts.JRXyDataset;
+import net.sf.jasperreports.charts.JRXySeries;
+import net.sf.jasperreports.engine.JRChartDataset;
+import net.sf.jasperreports.engine.JRConstants;
+import net.sf.jasperreports.engine.JRExpressionCollector;
+import net.sf.jasperreports.engine.base.JRBaseChartDataset;
+import net.sf.jasperreports.engine.base.JRBaseObjectFactory;
+import net.sf.jasperreports.engine.design.JRVerifier;
+
+/**
+ * @author Peter Risko (peter@risko.hu)
+ */
+public class JRBaseGanttDataset extends JRBaseChartDataset implements JRGanttDataset {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = JRConstants.SERIAL_VERSION_UID;
+
+    protected JRGanttSeries[] ganttSeries = null;
+
+    /**
+     *
+     */
+    public JRBaseGanttDataset(JRChartDataset dataset)
+    {
+        super(dataset);
+    }
+    
+    /**
+     *
+     */
+    public JRBaseGanttDataset(JRGanttDataset dataset, JRBaseObjectFactory factory)
+    {
+        super(dataset, factory);
+
+        /*   */
+        JRGanttSeries[] srcGanttSeries = dataset.getSeries();
+        if (srcGanttSeries != null && srcGanttSeries.length > 0)
+        {
+            ganttSeries = new JRGanttSeries[srcGanttSeries.length];
+            for(int i = 0; i < ganttSeries.length; i++)
+            {
+                ganttSeries[i] = factory.getGanttSeries(srcGanttSeries[i]);
+            }
+        }
+
+    }
+
+    
+    /**
+     *
+     */
+    public JRGanttSeries[] getSeries()
+    {
+        return ganttSeries;
+    }
+
+
+    /* (non-Javadoc)
+     * @see net.sf.jasperreports.engine.JRChartDataset#getDatasetType()
+     */
+    public byte getDatasetType() {
+        return JRChartDataset.GANTT_DATASET;
+    }
+
+    
+    /**
+     *
+     */
+    public void collectExpressions(JRExpressionCollector collector)
+    {
+        collector.collect(this);
+    }
+
+
+    public void validate(JRVerifier verifier)
+    {
+        verifier.verify(this);
+    }
+
+}
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/charts/base/JRBaseGanttSeries.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/base/JRBaseGanttSeries.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/charts/base/JRBaseGanttSeries.java	1970-01-01 00:00:00.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/base/JRBaseGanttSeries.java	2007-02-28 00:55:47.000000000 +0000
@@ -0,0 +1,111 @@
+package net.sf.jasperreports.charts.base;
+
+import java.io.Serializable;
+
+import net.sf.jasperreports.charts.JRGanttSeries;
+import net.sf.jasperreports.charts.JRXySeries;
+import net.sf.jasperreports.engine.JRConstants;
+import net.sf.jasperreports.engine.JRExpression;
+import net.sf.jasperreports.engine.JRHyperlink;
+import net.sf.jasperreports.engine.base.JRBaseObjectFactory;
+
+/**
+ * @author Peter Risko (peter@risko.hu)
+ */
+public class JRBaseGanttSeries implements JRGanttSeries, Serializable {
+    
+    /**
+     *
+     */
+    private static final long serialVersionUID = JRConstants.SERIAL_VERSION_UID;
+
+    protected JRExpression seriesExpression = null;
+    protected JRExpression taskValueExpression = null;
+    protected JRExpression subtaskValueExpression = null;
+    protected JRExpression startDateExpression = null;
+    protected JRExpression endDateExpression = null;
+    protected JRExpression labelExpression = null;
+    protected JRHyperlink itemHyperlink;
+
+    /**
+     *
+     */
+    protected JRBaseGanttSeries()
+    {
+    }
+    
+    
+    /**
+     *
+     */
+    public JRBaseGanttSeries(JRGanttSeries ganttSeries, JRBaseObjectFactory factory)
+    {
+        factory.put(ganttSeries, this);
+
+        seriesExpression = factory.getExpression(ganttSeries.getSeriesExpression());
+        taskValueExpression = factory.getExpression(ganttSeries.getTaskValueExpression());
+        subtaskValueExpression = factory.getExpression(ganttSeries.getSubtaskValueExpression());
+        startDateExpression = factory.getExpression(ganttSeries.getStartDateExpression());
+        endDateExpression = factory.getExpression(ganttSeries.getEndDateExpression());
+        labelExpression = factory.getExpression(ganttSeries.getLabelExpression());
+        itemHyperlink = factory.getHyperlink(ganttSeries.getItemHyperlink());
+    }
+
+    
+    /**
+     *
+     */
+    public JRExpression getSeriesExpression()
+    {
+        return seriesExpression;
+    }
+        
+    /**
+     *
+     */
+    public JRExpression getTaskValueExpression()
+    {
+        return taskValueExpression;
+    }
+        
+    /**
+    *
+    */
+   public JRExpression getSubtaskValueExpression()
+   {
+       return subtaskValueExpression;
+   }
+       
+   /**
+   *
+   */
+  public JRExpression getStartDateExpression()
+  {
+      return startDateExpression;
+  }
+      
+    /**
+     *
+     */
+    public JRExpression getEndDateExpression()
+    {
+        return endDateExpression;
+    }
+        
+    /**
+     *
+     */
+    public JRExpression getLabelExpression()
+    {
+        return labelExpression;
+    }
+
+    
+    public JRHyperlink getItemHyperlink()
+    {
+        return itemHyperlink;
+    }
+        
+
+
+}
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/charts/design/JRDesignGanttDataset.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/design/JRDesignGanttDataset.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/charts/design/JRDesignGanttDataset.java	1970-01-01 00:00:00.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/design/JRDesignGanttDataset.java	2007-02-28 00:55:47.000000000 +0000
@@ -0,0 +1,106 @@
+package net.sf.jasperreports.charts.design;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.jasperreports.charts.JRGanttDataset;
+import net.sf.jasperreports.charts.JRGanttSeries;
+import net.sf.jasperreports.charts.JRXyDataset;
+import net.sf.jasperreports.charts.JRXySeries;
+import net.sf.jasperreports.engine.JRChartDataset;
+import net.sf.jasperreports.engine.JRConstants;
+import net.sf.jasperreports.engine.JRExpressionCollector;
+import net.sf.jasperreports.engine.design.JRDesignChartDataset;
+import net.sf.jasperreports.engine.design.JRVerifier;
+
+/**
+ * @author Peter Risko (peter@risko.hu)
+ */
+public class JRDesignGanttDataset  extends JRDesignChartDataset implements JRGanttDataset {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = JRConstants.SERIAL_VERSION_UID;
+
+    private List ganttSeriesList = new ArrayList();
+
+
+    /**
+     *
+     */
+    public JRDesignGanttDataset(JRChartDataset dataset)
+    {
+        super(dataset);
+    }
+
+
+    /**
+     *
+     */
+    public JRGanttSeries[] getSeries()
+    {
+        JRGanttSeries[] ganttSeriesArray = new JRGanttSeries[ganttSeriesList.size()];
+        
+        ganttSeriesList.toArray(ganttSeriesArray);
+
+        return ganttSeriesArray;
+    }
+    
+
+    /**
+     * 
+     */
+    public List getSeriesList()
+    {
+        return ganttSeriesList;
+    }
+
+    
+    /**
+     *
+     */
+    public void addGanttSeries(JRGanttSeries ganttSeries)
+    {
+        ganttSeriesList.add(ganttSeries);
+    }
+    
+
+    /**
+     *
+     */
+    public JRGanttSeries removeGanttSeries(JRGanttSeries ganttSeries)
+    {
+        if (ganttSeries != null)
+        {
+            ganttSeriesList.remove(ganttSeries);
+        }
+        
+        return ganttSeries;
+    }
+
+
+    /** 
+     * 
+     */
+    public byte getDatasetType() {
+        return JRChartDataset.GANTT_DATASET;
+    }
+    
+    
+    /**
+     *
+     */
+    public void collectExpressions(JRExpressionCollector collector)
+    {
+        collector.collect(this);
+    }
+
+
+    public void validate(JRVerifier verifier)
+    {
+        verifier.verify(this);
+    }
+
+    
+}
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/charts/design/JRDesignGanttSeries.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/design/JRDesignGanttSeries.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/charts/design/JRDesignGanttSeries.java	1970-01-01 00:00:00.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/design/JRDesignGanttSeries.java	2007-02-28 00:55:47.000000000 +0000
@@ -0,0 +1,82 @@
+package net.sf.jasperreports.charts.design;
+
+import net.sf.jasperreports.charts.base.JRBaseGanttSeries;
+import net.sf.jasperreports.charts.base.JRBaseXySeries;
+import net.sf.jasperreports.engine.JRConstants;
+import net.sf.jasperreports.engine.JRExpression;
+import net.sf.jasperreports.engine.JRHyperlink;
+
+/**
+ * @author Peter Risko (peter@risko.hu)
+ */
+public class JRDesignGanttSeries extends JRBaseGanttSeries {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = JRConstants.SERIAL_VERSION_UID;
+
+    
+    /**
+     *
+     */
+    public void setSeriesExpression(JRExpression seriesExpression)
+    {
+        this.seriesExpression = seriesExpression;
+    }
+
+    /**
+    *
+    */
+   public void setTaskValueExpression(JRExpression taskValueExpression)
+   {
+       this.taskValueExpression = taskValueExpression;
+   }
+
+   /**
+   *
+   */
+  public void setSubtaskValueExpression(JRExpression subtaskValueExpression)
+  {
+      this.subtaskValueExpression = subtaskValueExpression;
+  }
+
+  /**
+  *
+  */
+ public void setStartDateExpression(JRExpression startDateExpression)
+ {
+     this.startDateExpression = startDateExpression;
+ }
+
+    /**
+     *
+     */
+    public void setEndDateExpression(JRExpression endDateExpression)
+    {
+        this.endDateExpression = endDateExpression;
+    }
+
+    /**
+     *
+     */
+    public void setLabelExpression(JRExpression labelExpression)
+    {
+        this.labelExpression = labelExpression;
+    }
+
+
+    /**
+     * Sets the hyperlink specification for chart items.
+     * 
+     * @param itemHyperlink the hyperlink specification
+     * @see #getItemHyperlink()
+     */
+    public void setItemHyperlink(JRHyperlink itemHyperlink)
+    {
+        this.itemHyperlink = itemHyperlink;
+    }
+
+
+    
+}
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/charts/fill/JRFillGanttDataset.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/fill/JRFillGanttDataset.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/charts/fill/JRFillGanttDataset.java	1970-01-01 00:00:00.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/fill/JRFillGanttDataset.java	2007-02-28 00:55:47.000000000 +0000
@@ -0,0 +1,263 @@
+package net.sf.jasperreports.charts.fill;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.sf.jasperreports.charts.JRGanttDataset;
+import net.sf.jasperreports.charts.JRGanttSeries;
+import net.sf.jasperreports.charts.util.CategoryLabelGenerator;
+import net.sf.jasperreports.engine.JRChartDataset;
+import net.sf.jasperreports.engine.JRExpressionCollector;
+import net.sf.jasperreports.engine.design.JRVerifier;
+import net.sf.jasperreports.engine.fill.JRCalculator;
+import net.sf.jasperreports.engine.fill.JRExpressionEvalException;
+import net.sf.jasperreports.engine.fill.JRFillChartDataset;
+import net.sf.jasperreports.engine.fill.JRFillObjectFactory;
+import net.sf.jasperreports.engine.util.Pair;
+
+import org.jfree.chart.labels.CategoryItemLabelGenerator;
+import org.jfree.data.gantt.Task;
+import org.jfree.data.gantt.TaskSeries;
+import org.jfree.data.gantt.TaskSeriesCollection;
+import org.jfree.data.general.Dataset;
+import org.jfree.data.time.SimpleTimePeriod;
+import org.jfree.data.time.TimePeriodValue;
+
+/**
+ * @author Peter Risko (peter@risko.hu)
+ */
+public class JRFillGanttDataset extends JRFillChartDataset implements JRGanttDataset {
+
+    /**
+     *
+     */
+    protected JRFillGanttSeries[] ganttSeries = null;
+
+    private List seriesNames = null;
+    private Map seriesMap = null;
+    private Map labelsMap = null;
+    
+    private Map itemHyperlinks;
+    
+    
+    /**
+     *
+     */
+    public JRFillGanttDataset(
+        JRGanttDataset ganttDataset, 
+        JRFillObjectFactory factory
+        )
+    {
+        super(ganttDataset, factory);
+        
+        /*   */
+        JRGanttSeries[] srcGanttSeries = ganttDataset.getSeries();
+        if (srcGanttSeries != null && srcGanttSeries.length > 0)
+        {
+            ganttSeries = new JRFillGanttSeries[srcGanttSeries.length];
+            for(int i = 0; i < ganttSeries.length; i++)
+            {
+                ganttSeries[i] = (JRFillGanttSeries)factory.getGanttSeries(srcGanttSeries[i]);
+            }
+        }
+    }
+    
+    
+    /**
+     *
+     */
+    public JRGanttSeries[] getSeries()
+    {
+        return ganttSeries;
+    }
+
+
+    /**
+     *
+     */
+    protected void customInitialize()
+    {
+        seriesNames = null;
+        seriesMap = null;
+        labelsMap = null;
+        itemHyperlinks = null;
+    }
+
+    
+    /**
+     *
+     */
+    protected void customEvaluate(JRCalculator calculator) throws JRExpressionEvalException
+    {
+        if (ganttSeries != null && ganttSeries.length > 0)
+        {
+            for(int i = 0; i < ganttSeries.length; i++)
+            {
+                ganttSeries[i].evaluate(calculator);
+            }
+        }
+    }
+
+    
+    /**
+     *
+     */
+    protected void customIncrement()
+    {
+        if (ganttSeries != null && ganttSeries.length > 0)
+        {
+            if (seriesNames == null)
+            {
+                seriesNames = new ArrayList();
+                seriesMap = new HashMap();
+                labelsMap = new HashMap();
+                itemHyperlinks = new HashMap();
+            }
+
+            for(int i = 0; i < ganttSeries.length; i++)
+            {
+                JRFillGanttSeries crtGanttSeries = ganttSeries[i];
+
+                Comparable seriesName = crtGanttSeries.getSeries();
+                TaskSeries taskSrs = (TaskSeries)seriesMap.get(seriesName);
+                if (taskSrs == null)
+                {
+                    taskSrs =  new TaskSeries((String)seriesName);
+                    seriesNames.add(seriesName);
+                    seriesMap.put(seriesName, taskSrs);
+                }
+                
+                // create task
+                Task task = taskSrs.get(crtGanttSeries.getTaskValue());
+                if(task == null) {
+                    task = new Task(crtGanttSeries.getTaskValue(), 
+                            crtGanttSeries.getStartDate(),
+                            crtGanttSeries.getEndDate());
+                    taskSrs.add(task);
+                }
+                // create subtask
+                Task subtask = new Task(crtGanttSeries.getSubtaskValue(),
+                        crtGanttSeries.getStartDate(),
+                        crtGanttSeries.getEndDate());
+                // NOTE: For correct scaling/plotting JFreeChart needs the subtasks
+                //       to be 'inside' of the containing task.
+                //       Therefore the earliest subtask startvalue
+                //       is set as startvalue for the whole task, and the
+                //       latest subtask endvalue set as endvalue for the
+                //       whole task.
+                if(subtask.getDuration().getStart().before(task.getDuration().getStart())) {
+                    task.setDuration(new SimpleTimePeriod(subtask.getDuration().getStart(), task.getDuration().getEnd()));
+                }
+                if(subtask.getDuration().getEnd().after(task.getDuration().getEnd())) {
+                    task.setDuration(new SimpleTimePeriod(task.getDuration().getStart(), subtask.getDuration().getEnd()));
+                }
+                task.addSubtask(subtask);
+                
+                if (crtGanttSeries.getLabelExpression() != null)
+                {
+                    Map seriesLabels = (Map)labelsMap.get(seriesName);
+                    if (seriesLabels == null)
+                    {
+                        seriesLabels = new HashMap();
+                        labelsMap.put(seriesName, seriesLabels);
+                    }
+                    
+                    // TODO: is it OK like this?
+                    //seriesLabels.put(crtXySeries.getXValue(), crtXySeries.getLabel());
+                    seriesLabels.put(crtGanttSeries.getTaskValue(), crtGanttSeries.getLabel());
+                }
+                
+                if (crtGanttSeries.hasItemHyperlinks())
+                {
+                    Map seriesLinks = (Map) itemHyperlinks.get(seriesName);
+                    if (seriesLinks == null)
+                    {
+                        seriesLinks = new HashMap();
+                        itemHyperlinks.put(seriesName, seriesLinks);
+                    }
+                    // TODO: ?? not sure how to do
+                    //Pair xyKey = new Pair(crtXySeries.getXValue(), crtXySeries.getYValue());
+                    //seriesLinks.put(xyKey, crtXySeries.getPrintItemHyperlink());
+                    Pair taskSubtaskKey = new Pair(crtGanttSeries.getTaskValue(), crtGanttSeries.getSubtaskValue());
+                    seriesLinks.put(taskSubtaskKey, crtGanttSeries.getPrintItemHyperlink());
+                }
+            }
+        }
+    }
+
+    
+    /**
+     *
+     */
+    public Dataset getCustomDataset()
+    {
+        TaskSeriesCollection dataset = new TaskSeriesCollection();
+        if (seriesNames != null)
+        {
+            for(int i = 0; i < seriesNames.size(); i++)
+            {
+                Comparable seriesName = (Comparable)seriesNames.get(i);
+                dataset.add((TaskSeries)seriesMap.get(seriesName));
+            }
+        }
+        return dataset;
+    }
+
+    
+    /**
+     * 
+     */
+    public byte getDatasetType() {
+        return JRChartDataset.GANTT_DATASET;
+    }
+    
+    
+    /**
+     * 
+     */
+    public CategoryItemLabelGenerator getLabelGenerator(){
+        return new CategoryLabelGenerator(labelsMap);
+    }
+    
+    
+    /**
+     *
+     */
+    public void collectExpressions(JRExpressionCollector collector)
+    {
+        collector.collect(this);
+    }
+
+    
+    public Map getItemHyperlinks()
+    {
+        return itemHyperlinks;
+    }
+    
+    
+    public boolean hasItemHyperlinks()
+    {
+        boolean foundLinks = false;
+        if (ganttSeries != null && ganttSeries.length > 0)
+        {
+            for (int i = 0; i < ganttSeries.length && !foundLinks; i++)
+            {
+                JRFillGanttSeries series = ganttSeries[i];
+                foundLinks = series.hasItemHyperlinks();
+            }
+        }
+        return foundLinks;
+    }
+
+
+    public void validate(JRVerifier verifier)
+    {
+        verifier.verify(this);
+    }
+
+
+    
+}
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/charts/fill/JRFillGanttSeries.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/fill/JRFillGanttSeries.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/charts/fill/JRFillGanttSeries.java	1970-01-01 00:00:00.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/fill/JRFillGanttSeries.java	2007-02-28 00:55:47.000000000 +0000
@@ -0,0 +1,186 @@
+package net.sf.jasperreports.charts.fill;
+
+import java.util.Date;
+
+import net.sf.jasperreports.charts.JRGanttSeries;
+import net.sf.jasperreports.charts.JRXySeries;
+import net.sf.jasperreports.engine.JRException;
+import net.sf.jasperreports.engine.JRExpression;
+import net.sf.jasperreports.engine.JRHyperlink;
+import net.sf.jasperreports.engine.JRPrintHyperlink;
+import net.sf.jasperreports.engine.JRRuntimeException;
+import net.sf.jasperreports.engine.fill.JRCalculator;
+import net.sf.jasperreports.engine.fill.JRExpressionEvalException;
+import net.sf.jasperreports.engine.fill.JRFillHyperlinkHelper;
+import net.sf.jasperreports.engine.fill.JRFillObjectFactory;
+
+/**
+ * @author Peter Risko (peter@risko.hu)
+ */
+public class JRFillGanttSeries implements JRGanttSeries {
+
+    /**
+     *
+     */
+    protected JRGanttSeries parent = null;
+
+    private Comparable series = null;
+    private String taskValue = null;
+    private String subtaskValue = null;
+    private Date startDate = null;
+    private Date endDate = null;
+    private String label = null;
+    private JRPrintHyperlink itemHyperlink;
+    
+    
+    /**
+     *
+     */
+    public JRFillGanttSeries(
+        JRGanttSeries ganttSeries, 
+        JRFillObjectFactory factory
+        )
+    {
+        factory.put(ganttSeries, this);
+
+        parent = ganttSeries;
+    }
+
+
+    /**
+     *
+     */
+    public JRExpression getSeriesExpression()
+    {
+        return parent.getSeriesExpression();
+    }
+        
+    public JRExpression getStartDateExpression(){
+        return parent.getStartDateExpression();
+    }
+    
+    public JRExpression getEndDateExpression(){
+        return parent.getEndDateExpression();
+    }
+    
+    /**
+     *
+     */
+    public JRExpression getTaskValueExpression()
+    {
+        return parent.getTaskValueExpression();
+    }
+        
+    /**
+     *
+     */
+    public JRExpression getSubtaskValueExpression()
+    {
+        return parent.getSubtaskValueExpression();
+    }
+        
+    /**
+     *
+     */
+    public JRExpression getLabelExpression()
+    {
+        return parent.getLabelExpression();
+    }
+    
+    
+    /**
+     *
+     */
+    protected Comparable getSeries()
+    {
+        return series;
+    }
+        
+    protected Date getStartDate(){
+        return startDate;
+    }
+    
+    protected Date getEndDate(){
+        return endDate;
+    }
+    
+    /**
+     *
+     */
+    protected String getTaskValue()
+    {
+        return taskValue;
+    }
+        
+    /**
+     *
+     */
+    protected String getSubtaskValue()
+    {
+        return subtaskValue;
+    }
+        
+    /**
+     *
+     */
+    protected String getLabel()
+    {
+        return label;
+    }
+    
+    protected JRPrintHyperlink getPrintItemHyperlink()
+    {
+        return itemHyperlink;
+    }
+    
+    
+    /**
+     *
+     */
+    protected void evaluate(JRCalculator calculator) throws JRExpressionEvalException
+    {
+        series = (Comparable)calculator.evaluate(getSeriesExpression()); 
+        startDate = (Date)calculator.evaluate( getStartDateExpression() );
+        endDate = (Date)calculator.evaluate( getEndDateExpression() );
+        taskValue = (String)calculator.evaluate(getTaskValueExpression()); 
+        subtaskValue = (String)calculator.evaluate(getSubtaskValueExpression());
+        label = (String)calculator.evaluate(getLabelExpression());
+        
+        if (hasItemHyperlinks())
+        {
+            evaluateItemHyperlink(calculator);
+        }
+    }
+
+
+    protected void evaluateItemHyperlink(JRCalculator calculator) throws JRExpressionEvalException
+    {
+        try
+        {
+            itemHyperlink = JRFillHyperlinkHelper.evaluateHyperlink(getItemHyperlink(), calculator, JRExpression.EVALUATION_DEFAULT);
+        }
+        catch (JRExpressionEvalException e)
+        {
+            throw e;
+        }
+        catch (JRException e)
+        {
+            throw new JRRuntimeException(e);
+        }
+    }
+
+
+    public JRHyperlink getItemHyperlink()
+    {
+        return parent.getItemHyperlink();
+    }
+
+    
+    public boolean hasItemHyperlinks()
+    {
+        return getItemHyperlink() != null;
+    }
+
+
+    
+}
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/charts/xml/JRGanttChartFactory.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/xml/JRGanttChartFactory.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/charts/xml/JRGanttChartFactory.java	1970-01-01 00:00:00.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/xml/JRGanttChartFactory.java	2007-02-28 00:55:47.000000000 +0000
@@ -0,0 +1,24 @@
+package net.sf.jasperreports.charts.xml;
+
+import net.sf.jasperreports.engine.JRChart;
+import net.sf.jasperreports.engine.design.JRDesignChart;
+import net.sf.jasperreports.engine.design.JasperDesign;
+import net.sf.jasperreports.engine.xml.JRBaseFactory;
+
+import org.xml.sax.Attributes;
+
+/**
+ * @author Peter Risko (peter@risko.hu)
+ */
+public class JRGanttChartFactory extends JRBaseFactory {
+
+    public Object createObject( Attributes attrs ){
+        JasperDesign jasperDesign = (JasperDesign)digester.peek(digester.getCount() - 2);
+
+        JRDesignChart chart = new JRDesignChart(jasperDesign, JRChart.CHART_TYPE_GANTT);
+
+        return chart;
+    }
+
+    
+}
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/charts/xml/JRGanttDatasetFactory.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/xml/JRGanttDatasetFactory.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/charts/xml/JRGanttDatasetFactory.java	1970-01-01 00:00:00.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/xml/JRGanttDatasetFactory.java	2007-02-28 00:55:47.000000000 +0000
@@ -0,0 +1,35 @@
+package net.sf.jasperreports.charts.xml;
+
+import net.sf.jasperreports.charts.design.JRDesignGanttDataset;
+import net.sf.jasperreports.engine.design.JRDesignChart;
+import net.sf.jasperreports.engine.xml.JRBaseFactory;
+
+import org.xml.sax.Attributes;
+
+/**
+ * @author Peter Risko (peter@risko.hu)
+ */
+public class JRGanttDatasetFactory extends JRBaseFactory {
+
+    /**
+     *
+     */
+    public Object createObject(Attributes atts)
+    {
+        JRDesignChart chart = (JRDesignChart) digester.peek();
+        
+        JRDesignGanttDataset dataset = null; 
+        
+        if( chart.getDataset() == null ){
+            dataset = new JRDesignGanttDataset( chart.getDataset() );
+        }
+        else {
+            dataset = (JRDesignGanttDataset)chart.getDataset();
+        }
+        
+        chart.setDataset( dataset );
+        return dataset;
+    }
+
+    
+}
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/charts/xml/JRGanttSeriesFactory.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/xml/JRGanttSeriesFactory.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/charts/xml/JRGanttSeriesFactory.java	1970-01-01 00:00:00.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/charts/xml/JRGanttSeriesFactory.java	2007-02-28 00:55:47.000000000 +0000
@@ -0,0 +1,22 @@
+package net.sf.jasperreports.charts.xml;
+
+import net.sf.jasperreports.charts.design.JRDesignGanttSeries;
+import net.sf.jasperreports.engine.xml.JRBaseFactory;
+
+import org.xml.sax.Attributes;
+
+/**
+ * @author Peter Risko (peter@risko.hu)
+ */
+public class JRGanttSeriesFactory extends JRBaseFactory {
+
+    /**
+     *
+     */
+    public Object createObject(Attributes atts)
+    {
+        return new JRDesignGanttSeries();
+    }
+
+    
+}
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/engine/JRChart.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/JRChart.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/engine/JRChart.java	2007-02-07 17:58:52.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/JRChart.java	2007-02-28 00:55:47.000000000 +0000
@@ -73,6 +73,7 @@
 	public static final byte CHART_TYPE_THERMOMETER = 18;
 	public static final byte CHART_TYPE_MULTI_AXIS = 19;
 	public static final byte CHART_TYPE_STACKEDAREA = 20;
+	public static final byte CHART_TYPE_GANTT = 21;
 
 
 	/**
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/engine/JRChartDataset.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/JRChartDataset.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/engine/JRChartDataset.java	2006-09-05 22:04:22.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/JRChartDataset.java	2007-02-28 00:55:47.000000000 +0000
@@ -46,6 +46,7 @@
 	public static final byte TIMESERIES_DATASET = 6;
 	public static final byte HIGHLOW_DATASET = 7;
 	public static final byte VALUE_DATASET = 8;
+	public static final byte GANTT_DATASET = 9;
 	
 	/**
 	 * Gets the dataset type. Must be one of the dataset type constants defined in this class.
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/engine/JRExpressionCollector.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/JRExpressionCollector.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/engine/JRExpressionCollector.java	2006-11-21 17:15:52.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/JRExpressionCollector.java	2007-02-28 00:55:47.000000000 +0000
@@ -45,6 +45,8 @@
 import net.sf.jasperreports.charts.JRCategoryDataset;
 import net.sf.jasperreports.charts.JRCategorySeries;
 import net.sf.jasperreports.charts.JRDataRange;
+import net.sf.jasperreports.charts.JRGanttDataset;
+import net.sf.jasperreports.charts.JRGanttSeries;
 import net.sf.jasperreports.charts.JRHighLowDataset;
 import net.sf.jasperreports.charts.JRHighLowPlot;
 import net.sf.jasperreports.charts.JRLinePlot;
@@ -675,6 +677,24 @@
 		}
 	}
 
+    /**
+     *
+     */
+    public void collect(JRGanttDataset ganttDataset)
+    {
+        collect((JRElementDataset) ganttDataset);
+        
+        JRGanttSeries[] ganttSeries = ganttDataset.getSeries();
+        if (ganttSeries != null && ganttSeries.length > 0)
+        {
+            JRExpressionCollector collector = getCollector(ganttDataset);
+            for(int j = 0; j < ganttSeries.length; j++)
+            {
+                collector.collect(ganttSeries[j]);
+            }
+        }
+    }
+
 	/**
 	 * 
 	 */
@@ -727,6 +747,21 @@
 		collectHyperlink(xySeries.getItemHyperlink());
 	}
 
+    /**
+     *
+     */
+    private void collect(JRGanttSeries ganttSeries)
+    {
+        addExpression(ganttSeries.getSeriesExpression());
+        addExpression(ganttSeries.getTaskValueExpression());
+        addExpression(ganttSeries.getSubtaskValueExpression());
+        addExpression(ganttSeries.getStartDateExpression());
+        addExpression(ganttSeries.getEndDateExpression());
+        addExpression(ganttSeries.getLabelExpression());
+        
+        collectHyperlink(ganttSeries.getItemHyperlink());
+    }
+
 	/**
 	 *
 	 */
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/engine/base/JRBaseChart.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/base/JRBaseChart.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/engine/base/JRBaseChart.java	2007-02-09 12:26:50.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/base/JRBaseChart.java	2007-02-28 00:55:47.000000000 +0000
@@ -37,6 +37,8 @@
 import net.sf.jasperreports.charts.JRBubblePlot;
 import net.sf.jasperreports.charts.JRCandlestickPlot;
 import net.sf.jasperreports.charts.JRCategoryDataset;
+import net.sf.jasperreports.charts.JRGanttDataset;
+import net.sf.jasperreports.charts.JRGanttSeries;
 import net.sf.jasperreports.charts.JRHighLowDataset;
 import net.sf.jasperreports.charts.JRHighLowPlot;
 import net.sf.jasperreports.charts.JRLinePlot;
@@ -260,6 +262,10 @@
 				dataset = factory.getCategoryDataset((JRCategoryDataset) chart.getDataset());
 				plot = factory.getAreaPlot((JRAreaPlot) chart.getPlot());
 				break;
+			case CHART_TYPE_GANTT:
+				dataset = factory.getGanttDataset((JRGanttDataset) chart.getDataset());
+				plot = factory.getBarPlot((JRBarPlot) chart.getPlot());
+				break;
 			default:
 				throw new JRRuntimeException("Chart type not supported.");
 		}
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/engine/base/JRBaseObjectFactory.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/base/JRBaseObjectFactory.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/engine/base/JRBaseObjectFactory.java	2007-02-09 12:26:50.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/base/JRBaseObjectFactory.java	2007-02-28 00:55:47.000000000 +0000
@@ -35,6 +35,8 @@
 import net.sf.jasperreports.charts.JRCategoryDataset;
 import net.sf.jasperreports.charts.JRCategorySeries;
 import net.sf.jasperreports.charts.JRChartAxis;
+import net.sf.jasperreports.charts.JRGanttDataset;
+import net.sf.jasperreports.charts.JRGanttSeries;
 import net.sf.jasperreports.charts.JRHighLowDataset;
 import net.sf.jasperreports.charts.JRHighLowPlot;
 import net.sf.jasperreports.charts.JRLinePlot;
@@ -63,6 +65,8 @@
 import net.sf.jasperreports.charts.base.JRBaseCategoryDataset;
 import net.sf.jasperreports.charts.base.JRBaseCategorySeries;
 import net.sf.jasperreports.charts.base.JRBaseChartAxis;
+import net.sf.jasperreports.charts.base.JRBaseGanttDataset;
+import net.sf.jasperreports.charts.base.JRBaseGanttSeries;
 import net.sf.jasperreports.charts.base.JRBaseHighLowDataset;
 import net.sf.jasperreports.charts.base.JRBaseHighLowPlot;
 import net.sf.jasperreports.charts.base.JRBaseLinePlot;
@@ -841,6 +845,25 @@
 		return baseXySeries;
 	}
 
+    /**
+     *
+     */
+    public JRGanttSeries getGanttSeries(JRGanttSeries ganttSeries)
+    {
+        JRBaseGanttSeries baseGanttSeries = null;
+
+        if (ganttSeries != null)
+        {
+            baseGanttSeries = (JRBaseGanttSeries)get(ganttSeries);
+            if (baseGanttSeries == null)
+            {
+                baseGanttSeries = new JRBaseGanttSeries(ganttSeries, this);
+            }
+        }
+
+        return baseGanttSeries;
+    }
+
 
 	/**
 	 *
@@ -991,6 +1014,24 @@
 		return baseXyDataset;
 	}
 
+    /*
+     *
+     */
+    public JRGanttDataset getGanttDataset(JRGanttDataset ganttDataset) {
+        JRBaseGanttDataset baseGanttDataset = null;
+
+        if (ganttDataset != null)
+        {
+            baseGanttDataset = (JRBaseGanttDataset)get(ganttDataset);
+            if (baseGanttDataset == null)
+            {
+                baseGanttDataset = new JRBaseGanttDataset(ganttDataset, this);
+            }
+        }
+
+        return baseGanttDataset;
+    }
+
 	/*
 	 *
 	 */
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/engine/design/JRDesignChart.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/design/JRDesignChart.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/engine/design/JRDesignChart.java	2007-02-09 12:26:50.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/design/JRDesignChart.java	2007-02-28 00:55:47.000000000 +0000
@@ -34,12 +34,15 @@
 import java.util.Iterator;
 import java.util.List;
 
+import net.sf.jasperreports.charts.JRGanttDataset;
+import net.sf.jasperreports.charts.JRGanttSeries;
 import net.sf.jasperreports.charts.design.JRDesignAreaPlot;
 import net.sf.jasperreports.charts.design.JRDesignBar3DPlot;
 import net.sf.jasperreports.charts.design.JRDesignBarPlot;
 import net.sf.jasperreports.charts.design.JRDesignBubblePlot;
 import net.sf.jasperreports.charts.design.JRDesignCandlestickPlot;
 import net.sf.jasperreports.charts.design.JRDesignCategoryDataset;
+import net.sf.jasperreports.charts.design.JRDesignGanttDataset;
 import net.sf.jasperreports.charts.design.JRDesignHighLowDataset;
 import net.sf.jasperreports.charts.design.JRDesignHighLowPlot;
 import net.sf.jasperreports.charts.design.JRDesignLinePlot;
@@ -652,7 +655,11 @@
 				dataset = new JRDesignCategoryDataset(dataset);
 				plot = new JRDesignAreaPlot(plot, this);
 				break;
-			default:
+            case CHART_TYPE_GANTT:
+                dataset = new JRDesignGanttDataset(dataset);
+                plot = new JRDesignBarPlot(plot, this);
+                break;
+    		default:
 				throw new JRRuntimeException("Chart type not supported.");
 		}
 	}
@@ -685,13 +692,16 @@
 			case JRChartDataset.XYZ_DATASET:
 				dataset = (JRDesignXyzDataset)ds;
 				break;
+            case JRChartDataset.GANTT_DATASET:
+                dataset = (JRDesignGanttDataset)ds;
+                break;
 		}
 	}
 
 
 	public JRChild getCopy(JRAbstractObjectFactory factory)
 	{
-		return factory.getChart( this );
+        return factory.getChart( this );
 	}
 
 
@@ -764,6 +774,9 @@
 			case CHART_TYPE_STACKEDAREA:
 				xmlWriter.writeStackedAreaChart(this);
 				break;
+            case CHART_TYPE_GANTT:
+                xmlWriter.writeGanttChart(this);
+                break;
 			default:
 				throw new JRRuntimeException("Chart type not supported.");
 		}
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/engine/design/JRVerifier.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/design/JRVerifier.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/engine/design/JRVerifier.java	2006-09-28 09:53:44.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/design/JRVerifier.java	2007-02-28 00:55:47.000000000 +0000
@@ -38,6 +38,8 @@
 
 import net.sf.jasperreports.charts.JRCategoryDataset;
 import net.sf.jasperreports.charts.JRCategorySeries;
+import net.sf.jasperreports.charts.JRGanttDataset;
+import net.sf.jasperreports.charts.JRGanttSeries;
 import net.sf.jasperreports.charts.JRHighLowDataset;
 import net.sf.jasperreports.charts.JRPieDataset;
 import net.sf.jasperreports.charts.JRTimePeriodDataset;
@@ -2244,12 +2246,31 @@
 		}
 	}
 
+    public void verify(JRGanttDataset dataset)
+    {
+        verifyElementDataset(dataset);
+        
+        JRGanttSeries[] series = dataset.getSeries();
+        if (series != null)
+        {
+            for (int i = 0; i < series.length; i++)
+            {
+                verify(series[i]);
+            }
+        }
+    }
+
 
 	protected void verify(JRXySeries series)
 	{
 		verifyHyperlink(series.getItemHyperlink());
 	}
 
+    protected void verify(JRGanttSeries series)
+    {
+        verifyHyperlink(series.getItemHyperlink());
+    }
+
 
 	public void verify(JRXyzDataset dataset)
 	{
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/engine/dtds/jasperreport.dtd jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/dtds/jasperreport.dtd
--- jasperreports-1.3.1/src/net/sf/jasperreports/engine/dtds/jasperreport.dtd	2007-02-12 12:16:14.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/dtds/jasperreport.dtd	2007-02-28 00:55:47.000000000 +0000
@@ -174,7 +174,7 @@
 <!ELEMENT lastPageFooter (band?)>
 <!ELEMENT summary (band?)>
 
-<!ELEMENT band (printWhenExpression?, (break | line | rectangle | ellipse | image | staticText | textField | subreport | pieChart | pie3DChart | barChart | bar3DChart | xyBarChart | stackedBarChart | stackedBar3DChart| lineChart | xyLineChart | areaChart | xyAreaChart | scatterChart | bubbleChart | timeSeriesChart | highLowChart | candlestickChart | meterChart | thermometerChart | multiAxisChart | stackedAreaChart | elementGroup | crosstab | frame)*)>
+<!ELEMENT band (printWhenExpression?, (break | line | rectangle | ellipse | image | staticText | textField | subreport | pieChart | pie3DChart | barChart | bar3DChart | xyBarChart | stackedBarChart | stackedBar3DChart| lineChart | ganttChart | xyLineChart | areaChart | xyAreaChart | scatterChart | bubbleChart | timeSeriesChart | highLowChart | candlestickChart | meterChart | thermometerChart | multiAxisChart | stackedAreaChart | elementGroup | crosstab | frame)*)>
 <!ATTLIST band
 	height NMTOKEN "0"
 	isSplitAllowed (true | false) "true"
@@ -348,7 +348,7 @@
 	class (java.lang.String | java.io.File | java.net.URL | java.io.InputStream | net.sf.jasperreports.engine.JasperReport | dori.jasper.engine.JasperReport) "java.lang.String"
 >
 
-<!ELEMENT elementGroup (break | line | rectangle | ellipse | image | staticText | textField | subreport | pieChart | pie3DChart | barChart | bar3DChart | xyBarChart | stackedBarChart | stackedBar3DChart| lineChart | xyLineChart | areaChart | xyAreaChart | scatterChart | bubbleChart | timeSeriesChart | highLowChart | candlestickChart | meterChart | thermometerChart | multiAxisChart | stackedAreaChart | elementGroup | crosstab | frame)*>
+<!ELEMENT elementGroup (break | line | rectangle | ellipse | image | staticText | textField | subreport | pieChart | pie3DChart | barChart | bar3DChart | xyBarChart | stackedBarChart | stackedBar3DChart| lineChart | ganttChart | xyLineChart | areaChart | xyAreaChart | scatterChart | bubbleChart | timeSeriesChart | highLowChart | candlestickChart | meterChart | thermometerChart | multiAxisChart | stackedAreaChart | elementGroup | crosstab | frame)*>
 
 <!ELEMENT chart (reportElement, box?, chartTitle?, chartSubtitle?, chartLegend?, anchorNameExpression?, hyperlinkReferenceExpression?, hyperlinkAnchorExpression?, hyperlinkPageExpression?, hyperlinkTooltipExpression?, hyperlinkParameter*)>
 <!ATTLIST chart
@@ -500,6 +500,12 @@
 <!ELEMENT xValueExpression (#PCDATA)>
 <!ELEMENT yValueExpression (#PCDATA)>
 
+<!ELEMENT ganttChart (chart, ganttDataset, barPlot)>
+<!ELEMENT ganttDataset (dataset?, ganttSeries*)>
+<!ELEMENT ganttSeries (seriesExpression?, taskValueExpression, subtaskValueExpression, startDateExpression?, endDateExpression?)>
+<!ELEMENT taskValueExpression (#PCDATA)>
+<!ELEMENT subtaskValueExpression (#PCDATA)>
+
 <!ELEMENT areaChart (chart, categoryDataset, areaPlot)>
 <!ELEMENT areaPlot (plot, categoryAxisLabelExpression?, categoryAxisFormat?, valueAxisLabelExpression?, valueAxisFormat?)>
 
@@ -604,7 +610,7 @@
 
 <!ELEMENT multiAxisChart (chart, multiAxisPlot)>
 <!ELEMENT multiAxisPlot (plot, axis+)>
-<!ELEMENT axis (barChart | bar3DChart | xyBarChart | stackedBarChart | stackedBar3DChart| lineChart | xyLineChart | areaChart | xyAreaChart | scatterChart | bubbleChart | timeSeriesChart | highLowChart | candlestickChart | stackedAreaChart)>
+<!ELEMENT axis (barChart | bar3DChart | xyBarChart | stackedBarChart | stackedBar3DChart| lineChart | ganttChart | xyLineChart | areaChart | xyAreaChart | scatterChart | bubbleChart | timeSeriesChart | highLowChart | candlestickChart | stackedAreaChart)>
 <!ATTLIST axis
 	position (leftOrTop | rightOrBottom) "leftOrTop"
 >
@@ -696,4 +702,4 @@
 
 <!ELEMENT whenNoDataCell (cellContents)>
 
-<!ELEMENT frame (reportElement, box?, (break | line | rectangle | ellipse | image | staticText | textField | subreport | pieChart | pie3DChart | barChart | bar3DChart | xyBarChart | stackedBarChart | stackedBar3DChart| lineChart | xyLineChart | areaChart | xyAreaChart | scatterChart | bubbleChart | timeSeriesChart | highLowChart | candlestickChart | meterChart | thermometerChart | multiAxisChart | stackedAreaChart | elementGroup | crosstab | frame)*)>
+<!ELEMENT frame (reportElement, box?, (break | line | rectangle | ellipse | image | staticText | textField | subreport | pieChart | pie3DChart | barChart | bar3DChart | xyBarChart | stackedBarChart | stackedBar3DChart| lineChart | ganttChart | xyLineChart | areaChart | xyAreaChart | scatterChart | bubbleChart | timeSeriesChart | highLowChart | candlestickChart | meterChart | thermometerChart | multiAxisChart | stackedAreaChart | elementGroup | crosstab | frame)*)>
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/engine/fill/JRFillChart.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/fill/JRFillChart.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/engine/fill/JRFillChart.java	2007-02-09 12:26:50.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/fill/JRFillChart.java	2007-02-28 00:55:47.000000000 +0000
@@ -47,6 +47,8 @@
 import net.sf.jasperreports.charts.JRCategoryDataset;
 import net.sf.jasperreports.charts.JRChartAxis;
 import net.sf.jasperreports.charts.JRDataRange;
+import net.sf.jasperreports.charts.JRGanttDataset;
+import net.sf.jasperreports.charts.JRGanttSeries;
 import net.sf.jasperreports.charts.JRHighLowDataset;
 import net.sf.jasperreports.charts.JRHighLowPlot;
 import net.sf.jasperreports.charts.JRLinePlot;
@@ -69,6 +71,7 @@
 import net.sf.jasperreports.charts.fill.JRFillBarPlot;
 import net.sf.jasperreports.charts.fill.JRFillCategoryDataset;
 import net.sf.jasperreports.charts.fill.JRFillChartAxis;
+import net.sf.jasperreports.charts.fill.JRFillGanttDataset;
 import net.sf.jasperreports.charts.fill.JRFillHighLowDataset;
 import net.sf.jasperreports.charts.fill.JRFillLinePlot;
 import net.sf.jasperreports.charts.fill.JRFillMeterPlot;
@@ -116,6 +119,7 @@
 import net.sf.jasperreports.renderers.JRTimeSeriesChartImageMapRenderer;
 import net.sf.jasperreports.renderers.JRXYChartImageMapRenderer;
 
+import org.apache.tools.ant.taskdefs.Taskdef;
 import org.jfree.chart.ChartFactory;
 import org.jfree.chart.JFreeChart;
 import org.jfree.chart.axis.Axis;
@@ -148,6 +152,7 @@
 import org.jfree.chart.title.TextTitle;
 import org.jfree.data.Range;
 import org.jfree.data.category.CategoryDataset;
+import org.jfree.data.gantt.GanttCategoryDataset;
 import org.jfree.data.general.PieDataset;
 import org.jfree.data.general.ValueDataset;
 import org.jfree.data.time.TimeSeriesCollection;
@@ -244,14 +249,14 @@
 				dataset = (JRFillChartDataset) factory.getCategoryDataset((JRCategoryDataset) chart.getDataset());
 				plot = factory.getLinePlot((JRLinePlot) chart.getPlot());
 				break;
-		    case CHART_TYPE_METER:
-		        dataset = (JRFillChartDataset) factory.getValueDataset((JRValueDataset) chart.getDataset());
-                plot = factory.getMeterPlot((JRMeterPlot) chart.getPlot());
-                break;
-		    case CHART_TYPE_MULTI_AXIS:
-                plot = factory.getMultiAxisPlot((JRMultiAxisPlot) chart.getPlot());
-                dataset = ((JRFillMultiAxisPlot)plot).getMainDataset();
-                break;
+			case CHART_TYPE_METER:
+				dataset = (JRFillChartDataset) factory.getValueDataset((JRValueDataset) chart.getDataset());
+				plot = factory.getMeterPlot((JRMeterPlot) chart.getPlot());
+			break;
+				case CHART_TYPE_MULTI_AXIS:
+				plot = factory.getMultiAxisPlot((JRMultiAxisPlot) chart.getPlot());
+				dataset = ((JRFillMultiAxisPlot)plot).getMainDataset();
+			break;
 			case CHART_TYPE_PIE:
 				dataset = (JRFillChartDataset) factory.getPieDataset((JRPieDataset) chart.getDataset());
 				plot = factory.getPiePlot((JRPiePlot) chart.getPlot());
@@ -307,6 +312,10 @@
 				dataset = (JRFillChartDataset) factory.getCategoryDataset((JRCategoryDataset) chart.getDataset());
 				plot = factory.getAreaPlot((JRAreaPlot) chart.getPlot());
 				break;
+			case CHART_TYPE_GANTT:
+				dataset = (JRFillChartDataset) factory.getGanttDataset( (JRGanttDataset) chart.getDataset() );
+				plot = factory.getBarPlot((JRBarPlot) chart.getPlot());
+				break;
 			default:
 				throw new JRRuntimeException("Chart type not supported.");
 		}
@@ -777,6 +786,9 @@
 			case CHART_TYPE_STACKEDAREA:
 				chartRenderer = evaluateStackedAreaImage(evaluation);
 				break;
+            case CHART_TYPE_GANTT:
+                chartRenderer = evaluateGanttImage(evaluation);
+                break;
 			default:
 				throw new JRRuntimeException("Chart type " + getChartType() + " not supported.");
 		}
@@ -1367,6 +1379,67 @@
 
 	}
 
+    /**
+     *
+     */
+    protected JFreeChartRenderer evaluateGanttImage(byte evaluation) throws JRException
+    {
+        //CategoryDataset categoryDataset = (CategoryDataset)dataset.getDataset();
+        GanttCategoryDataset ganttCategoryDataset = (GanttCategoryDataset)dataset.getDataset();
+        // TODO: legend/tooltip/url should come from plot (?)
+        JFreeChart chart =
+            ChartFactory.createGanttChart(
+                (String)evaluateExpression(getTitleExpression(), evaluation),
+                (String)evaluateExpression(((JRBarPlot)getPlot()).getCategoryAxisLabelExpression(), evaluation),
+                (String)evaluateExpression(((JRBarPlot)getPlot()).getValueAxisLabelExpression(), evaluation),
+                ganttCategoryDataset,
+                //getPlot().getOrientation(),
+                //isShowLegend(),
+                ((JRBarPlot)getPlot()).isShowLabels(),  // incl. legend
+                true,  // tooltip TODO: I guess BarPlot is not the best for gantt
+                false
+                );
+
+        configureChart(chart, getPlot(), evaluation);
+
+        CategoryPlot categoryPlot = (CategoryPlot)chart.getPlot();
+        //plot.setNoDataMessage("No data to display");
+
+        JRFillBarPlot barPlot = (JRFillBarPlot)getPlot();
+        categoryPlot.getDomainAxis().setTickMarksVisible(
+            barPlot.isShowTickMarks()
+            );
+        categoryPlot.getDomainAxis().setTickLabelsVisible(
+                barPlot.isShowTickLabels()
+                );
+        // Handle the axis formating for the catagory axis
+        configureAxis(categoryPlot.getDomainAxis(), barPlot.getCategoryAxisLabelFont(),
+                barPlot.getCategoryAxisLabelColor(), barPlot.getCategoryAxisTickLabelFont(),
+                barPlot.getCategoryAxisTickLabelColor(), barPlot.getCategoryAxisTickLabelMask(),
+                barPlot.getCategoryAxisLineColor());
+
+        ((DateAxis)categoryPlot.getRangeAxis()).setTickMarksVisible(
+                barPlot.isShowTickMarks()
+                );
+        ((DateAxis)categoryPlot.getRangeAxis()).setTickLabelsVisible(
+                barPlot.isShowTickLabels()
+                );
+        // Handle the axis formating for the value axis
+        configureAxis(categoryPlot.getRangeAxis(), barPlot.getValueAxisLabelFont(),
+                barPlot.getValueAxisLabelColor(), barPlot.getValueAxisTickLabelFont(),
+                barPlot.getValueAxisTickLabelColor(), barPlot.getValueAxisTickLabelMask(),
+                barPlot.getValueAxisLineColor());
+
+
+        CategoryItemRenderer categoryRenderer = categoryPlot.getRenderer();
+        categoryRenderer.setBaseItemLabelGenerator(((JRFillGanttDataset)getDataset()).getLabelGenerator());
+        categoryRenderer.setItemLabelsVisible( barPlot.isShowLabels() );
+        
+        //return getCategoryRenderer(chart);
+        return getGanttRenderer(chart);
+
+    }
+
 
 	protected JFreeChartRenderer evaluateBubbleImage( byte evaluation ) throws JRException {
 		JFreeChart chart = ChartFactory.createBubbleChart(
@@ -2914,4 +2987,21 @@
 		}
 		return chartRenderer;
 	}
+
+    protected JFreeChartRenderer getGanttRenderer(JFreeChart chart)
+    {
+        JFreeChartRenderer chartRenderer;
+        JRFillGanttDataset ganttDataset = (JRFillGanttDataset) getDataset();
+        if (ganttDataset.hasItemHyperlinks())
+        {
+            // TODO: specific renderer is neccessary only if there are hyperlinks?
+            chartRenderer = new JRCategoryChartImageMapRenderer(chart, ganttDataset.getItemHyperlinks());
+        }
+        else
+        {
+            chartRenderer = new JFreeChartRenderer(chart);
+        }
+        return chartRenderer;
+    }
+
 }
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/engine/fill/JRFillChartPlot.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/fill/JRFillChartPlot.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/engine/fill/JRFillChartPlot.java	2007-02-09 12:26:52.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/fill/JRFillChartPlot.java	2007-02-28 00:55:47.000000000 +0000
@@ -30,6 +30,8 @@
 import java.awt.Color;
 import java.util.SortedSet;
 
+import net.sf.jasperreports.charts.JRGanttDataset;
+import net.sf.jasperreports.charts.JRGanttSeries;
 import net.sf.jasperreports.engine.JRChart;
 import net.sf.jasperreports.engine.JRChartPlot;
 import net.sf.jasperreports.engine.JRExpressionCollector;
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/engine/fill/JRFillObjectFactory.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/fill/JRFillObjectFactory.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/engine/fill/JRFillObjectFactory.java	2007-02-09 12:26:52.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/fill/JRFillObjectFactory.java	2007-02-28 00:55:47.000000000 +0000
@@ -40,6 +40,8 @@
 import net.sf.jasperreports.charts.JRCategoryDataset;
 import net.sf.jasperreports.charts.JRCategorySeries;
 import net.sf.jasperreports.charts.JRChartAxis;
+import net.sf.jasperreports.charts.JRGanttDataset;
+import net.sf.jasperreports.charts.JRGanttSeries;
 import net.sf.jasperreports.charts.JRHighLowDataset;
 import net.sf.jasperreports.charts.JRHighLowPlot;
 import net.sf.jasperreports.charts.JRLinePlot;
@@ -68,6 +70,8 @@
 import net.sf.jasperreports.charts.fill.JRFillCategoryDataset;
 import net.sf.jasperreports.charts.fill.JRFillCategorySeries;
 import net.sf.jasperreports.charts.fill.JRFillChartAxis;
+import net.sf.jasperreports.charts.fill.JRFillGanttDataset;
+import net.sf.jasperreports.charts.fill.JRFillGanttSeries;
 import net.sf.jasperreports.charts.fill.JRFillHighLowDataset;
 import net.sf.jasperreports.charts.fill.JRFillHighLowPlot;
 import net.sf.jasperreports.charts.fill.JRFillLinePlot;
@@ -573,7 +577,6 @@
 	public JRChart getChart(JRChart chart)
 	{
 		JRFillChart fillChart = null;
-
 		if (chart != null)
 		{
 			fillChart = (JRFillChart)get(chart);
@@ -703,6 +706,26 @@
 		return fillXyDataset;
 	}
 
+    /**
+     *
+     */
+    public JRGanttDataset getGanttDataset(JRGanttDataset ganttDataset)
+    {
+        JRFillGanttDataset fillGanttDataset = null;
+
+        if (ganttDataset != null)
+        {
+            fillGanttDataset = (JRFillGanttDataset)get(ganttDataset);
+            if (fillGanttDataset == null)
+            {
+                fillGanttDataset = new JRFillGanttDataset(ganttDataset, this);
+                addChartDataset(fillGanttDataset);
+            }
+        }
+
+        return fillGanttDataset;
+    }
+
 
 	/**
 	 *
@@ -790,6 +813,25 @@
 	}
 
 
+    /**
+     *
+     */
+    public JRGanttSeries getGanttSeries(JRGanttSeries ganttSeries)
+    {
+        JRFillGanttSeries fillGanttSeries = null;
+
+        if (ganttSeries != null)
+        {
+            fillGanttSeries = (JRFillGanttSeries)get(ganttSeries);
+            if (fillGanttSeries == null)
+            {
+                fillGanttSeries = new JRFillGanttSeries(ganttSeries, this);
+            }
+        }
+
+        return fillGanttSeries;
+    }
+
 	/**
 	 *
 	 */
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/engine/xml/JRXmlConstants.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/xml/JRXmlConstants.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/engine/xml/JRXmlConstants.java	2007-02-15 09:12:48.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/xml/JRXmlConstants.java	2007-02-28 00:55:47.000000000 +0000
@@ -1476,7 +1476,11 @@
 	public static final String ELEMENT_openExpression = "openExpression";
 	public static final String ELEMENT_closeExpression = "closeExpression";
 	public static final String ELEMENT_volumeExpression = "volumeExpression";
-
+    public static final String ELEMENT_ganttDataset = "ganttDataset";
+    public static final String ELEMENT_ganttSeries = "ganttSeries";
+    public static final String ELEMENT_taskValueExpression = "taskValueExpression";
+    public static final String ELEMENT_subtaskValueExpression = "subtaskValueExpression";
+    public static final String ELEMENT_ganttChart = "ganttChart";
 	public static final String ATTRIBUTE_timePeriod = "timePeriod";
 
 	/**
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/engine/xml/JRXmlDigesterFactory.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/xml/JRXmlDigesterFactory.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/engine/xml/JRXmlDigesterFactory.java	2007-02-12 15:19:04.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/xml/JRXmlDigesterFactory.java	2007-02-28 00:55:47.000000000 +0000
@@ -32,6 +32,7 @@
 import net.sf.jasperreports.charts.JRChartAxis;
 import net.sf.jasperreports.charts.design.JRDesignCategorySeries;
 import net.sf.jasperreports.charts.design.JRDesignDataRange;
+import net.sf.jasperreports.charts.design.JRDesignGanttSeries;
 import net.sf.jasperreports.charts.design.JRDesignTimePeriodSeries;
 import net.sf.jasperreports.charts.design.JRDesignTimeSeries;
 import net.sf.jasperreports.charts.design.JRDesignValueDisplay;
@@ -53,6 +54,9 @@
 import net.sf.jasperreports.charts.xml.JRCategorySeriesFactory;
 import net.sf.jasperreports.charts.xml.JRChartAxisFactory;
 import net.sf.jasperreports.charts.xml.JRDataRangeFactory;
+import net.sf.jasperreports.charts.xml.JRGanttChartFactory;
+import net.sf.jasperreports.charts.xml.JRGanttDatasetFactory;
+import net.sf.jasperreports.charts.xml.JRGanttSeriesFactory;
 import net.sf.jasperreports.charts.xml.JRHighLowChartFactory;
 import net.sf.jasperreports.charts.xml.JRHighLowDatasetFactory;
 import net.sf.jasperreports.charts.xml.JRHighLowPlotFactory;
@@ -677,7 +681,12 @@
 	
 		digester.addFactoryCreate( "*/xyLineChart", JRXyLineChartFactory.class.getName() );
 		digester.addSetNext( "*/xyLineChart", "addElement", JRDesignElement.class.getName() );
-	
+
+		// gantt support 
+        digester.addFactoryCreate( "*/ganttChart", JRGanttChartFactory.class.getName() );
+        digester.addSetNext( "*/ganttChart", "addElement", JRDesignElement.class.getName() );
+        digester.addFactoryCreate("*/ganttChart/barPlot", JRBarPlotFactory.class.getName());
+        
 		digester.addFactoryCreate( "*/scatterChart", JRScatterChartFactory.class.getName() );
 		digester.addSetNext( "*/scatterChart", "addElement", JRDesignElement.class.getName() );
 		digester.addFactoryCreate( "*/scatterPlot", JRScatterPlotFactory.class.getName() );
@@ -710,6 +719,30 @@
 		digester.addSetNext("*/xySeries/labelExpression", "setLabelExpression", JRDesignExpression.class.getName());
 		digester.addCallMethod("*/xySeries/labelExpression", "setText", 0);
 
+        // gantt support
+        digester.addFactoryCreate("*/ganttDataset", JRGanttDatasetFactory.class.getName());
+        digester.addFactoryCreate("*/ganttDataset/ganttSeries", JRGanttSeriesFactory.class.getName());
+        digester.addSetNext("*/ganttDataset/ganttSeries", "addGanttSeries", JRDesignGanttSeries.class.getName());
+        digester.addFactoryCreate("*/ganttSeries", JRGanttDatasetFactory.class.getName());
+        digester.addFactoryCreate("*/ganttSeries/seriesExpression", JRExpressionFactory.ComparableExpressionFactory.class);
+        digester.addSetNext("*/ganttSeries/seriesExpression", "setSeriesExpression", JRDesignExpression.class.getName());
+        digester.addCallMethod("*/ganttSeries/seriesExpression", "setText", 0);
+        digester.addFactoryCreate("*/ganttSeries/taskValueExpression", JRExpressionFactory.StringExpressionFactory.class);
+        digester.addSetNext("*/ganttSeries/taskValueExpression", "setTaskValueExpression", JRDesignExpression.class.getName());
+        digester.addCallMethod("*/ganttSeries/taskValueExpression", "setText", 0);
+        digester.addFactoryCreate("*/ganttSeries/subtaskValueExpression", JRExpressionFactory.StringExpressionFactory.class);
+        digester.addSetNext("*/ganttSeries/subtaskValueExpression", "setSubtaskValueExpression", JRDesignExpression.class.getName());
+        digester.addCallMethod("*/ganttSeries/subtaskValueExpression", "setText", 0);
+        digester.addFactoryCreate("*/ganttSeries/startDateExpression", JRExpressionFactory.DateExpressionFactory.class);
+        digester.addSetNext("*/ganttSeries/startDateExpression", "setStartDateExpression", JRDesignExpression.class.getName());
+        digester.addCallMethod("*/ganttSeries/startDateExpression", "setText", 0);
+        digester.addFactoryCreate("*/ganttSeries/endDateExpression", JRExpressionFactory.DateExpressionFactory.class);
+        digester.addSetNext("*/ganttSeries/endDateExpression", "setEndDateExpression", JRDesignExpression.class.getName());
+        digester.addCallMethod("*/ganttSeries/endDateExpression", "setText", 0);
+        digester.addFactoryCreate("*/ganttSeries/labelExpression", JRExpressionFactory.StringExpressionFactory.class);
+        digester.addSetNext("*/ganttSeries/labelExpression", "setLabelExpression", JRDesignExpression.class.getName());
+        digester.addCallMethod("*/ganttSeries/labelExpression", "setText", 0);
+        
 		digester.addFactoryCreate("*/stackedBar3DChart", JRStackedBar3DChartFactory.class.getName());
 		digester.addSetNext("*/stackedBar3DChart", "addElement", JRDesignElement.class.getName());
 		digester.addFactoryCreate("*/stackedBar3DChart/bar3DPlot", JRBar3DPlotFactory.class.getName());
diff -Naur jasperreports-1.3.1/src/net/sf/jasperreports/engine/xml/JRXmlWriter.java jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/xml/JRXmlWriter.java
--- jasperreports-1.3.1/src/net/sf/jasperreports/engine/xml/JRXmlWriter.java	2007-02-15 09:12:48.000000000 +0000
+++ jasperreports-1.3.1_gantted/src/net/sf/jasperreports/engine/xml/JRXmlWriter.java	2007-02-28 00:55:47.000000000 +0000
@@ -51,6 +51,8 @@
 import net.sf.jasperreports.charts.JRCategorySeries;
 import net.sf.jasperreports.charts.JRChartAxis;
 import net.sf.jasperreports.charts.JRDataRange;
+import net.sf.jasperreports.charts.JRGanttDataset;
+import net.sf.jasperreports.charts.JRGanttSeries;
 import net.sf.jasperreports.charts.JRHighLowDataset;
 import net.sf.jasperreports.charts.JRHighLowPlot;
 import net.sf.jasperreports.charts.JRLinePlot;
@@ -1304,6 +1306,24 @@
 		writer.closeElement();
 	}
 
+    /**
+     *
+     */
+    private void writeGanttSeries(JRGanttSeries ganttSeries) throws IOException
+    {
+        writer.startElement(JRXmlConstants.ELEMENT_ganttSeries);
+
+        writer.writeExpression(JRXmlConstants.ELEMENT_seriesExpression, ganttSeries.getSeriesExpression(), false);
+        writer.writeExpression(JRXmlConstants.ELEMENT_taskValueExpression, ganttSeries.getTaskValueExpression(), false);
+        writer.writeExpression(JRXmlConstants.ELEMENT_subtaskValueExpression, ganttSeries.getSubtaskValueExpression(), false);
+        writer.writeExpression(JRXmlConstants.ELEMENT_startDateExpression, ganttSeries.getStartDateExpression(), false);
+        writer.writeExpression(JRXmlConstants.ELEMENT_endDateExpression, ganttSeries.getEndDateExpression(), false);
+        writer.writeExpression(JRXmlConstants.ELEMENT_labelExpression, ganttSeries.getLabelExpression(), false);
+        writeHyperlink(JRXmlConstants.ELEMENT_itemHyperlink, ganttSeries.getItemHyperlink());
+
+        writer.closeElement();
+    }
+
 
 	/**
 	 *
@@ -1327,6 +1347,27 @@
 		writer.closeElement();
 	}
 
+    /**
+     *
+     */
+    private void writeGanttDataset(JRGanttDataset dataset) throws IOException
+    {
+        writer.startElement(JRXmlConstants.ELEMENT_ganttDataset);
+
+        writeElementDataset(dataset);
+
+        /*   */
+        JRGanttSeries[] ganttSeries = dataset.getSeries();
+        if (ganttSeries != null && ganttSeries.length > 0)
+        {
+            for(int i = 0; i < ganttSeries.length; i++)
+            {
+                writeGanttSeries(ganttSeries[i]);
+            }
+        }
+
+        writer.closeElement();
+    }
 
 	/**
 	 *
@@ -2004,6 +2045,20 @@
 		writer.closeElement();
 	}
 
+    /**
+     *
+     */
+    public void writeGanttChart(JRChart chart) throws IOException
+    {
+        writer.startElement(JRXmlConstants.ELEMENT_ganttChart);
+
+        writeChart(chart);
+        writeGanttDataset((JRGanttDataset) chart.getDataset());
+        writeBarPlot((JRBarPlot) chart.getPlot());
+
+        writer.closeElement();
+    }
+
 
 	/**
 	 * Writes the definition of a meter chart to the output stream.
