/*
GanttProject is an opensource project management tool. License: GPL3
Copyright (C) 2011 GanttProject Team
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.ganttproject.impex.htmlpdf.itext;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import org.ganttproject.impex.htmlpdf.fonts.TTFontCache;
import com.itextpdf.text.Document;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter;
import net.sourceforge.ganttproject.GanttExportSettings;
import net.sourceforge.ganttproject.chart.ChartModel;
import net.sourceforge.ganttproject.chart.TimelineChart;
import net.sourceforge.ganttproject.chart.export.ChartDimensions;
import net.sourceforge.ganttproject.chart.export.ChartImageVisitor;
/**
* Provides functions for writing charts to PDF writer.
*
* @author dbarashev (Dmitry Barashev)
*/
class ChartWriter implements ChartImageVisitor {
private final Document myDoc;
private final TimelineChart myChart;
private final GanttExportSettings myExportSettings;
private final PdfWriter myWriter;
private final TTFontCache myFontCache;
private float myScale;
private float myYShift;
private PdfTemplate myTemplate;
private Graphics2D myGraphics;
private final String myCharset;
private final FontSubstitutionModel mySubstitutions;
ChartWriter(TimelineChart chart, PdfWriter writer, Document doc, GanttExportSettings exportSettings,
TTFontCache fontCache, FontSubstitutionModel substitutionModel, String charset) {
myChart = chart;
myWriter = writer;
myDoc = doc;
myExportSettings = exportSettings;
myFontCache = fontCache;
myCharset = charset;
mySubstitutions = substitutionModel;
}
protected ChartModel getModel() {
return myChart.getModel();
}
void write() {
setupChart(myExportSettings);
myChart.buildImage(myExportSettings, this);
myGraphics.dispose();
myWriter.getDirectContent().addTemplate(myTemplate, myScale, 0, 0, myScale, myDoc.leftMargin(), myYShift);
}
private Graphics2D getGraphics(ChartDimensions d) {
if (myGraphics == null) {
myTemplate = myWriter.getDirectContent().createTemplate(d.getFullWidth(), d.getChartHeight());
Rectangle page = myDoc.getPageSize();
final float width = page.getWidth() - myDoc.leftMargin() - myDoc.rightMargin();
final float height = page.getHeight() - myDoc.bottomMargin() - myDoc.topMargin();
final float xscale = width / d.getFullWidth();
final float yscale = height / d.getChartHeight();
myScale = Math.min(xscale, yscale);
myYShift = height - d.getChartHeight() * myScale + myDoc.bottomMargin();
myGraphics = myTemplate.createGraphics(d.getFullWidth(), d.getChartHeight(),
myFontCache.getFontMapper(mySubstitutions, myCharset));
myGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
}
return myGraphics;
}
protected void setupChart(GanttExportSettings settings) {
// myChart.gmyModel.setBounds(myModel.getMaxBounds());
}
@Override
public void acceptLogo(ChartDimensions d, Image logo) {
Graphics2D g = getGraphics(d);
g.setBackground(Color.WHITE);
g.clearRect(0, 0, d.getTreeWidth(), d.getLogoHeight());
g.drawImage(logo, 0, 0, null);
}
@Override
public void acceptTable(ChartDimensions d, Component header, Component table) {
Graphics2D g = getGraphics(d);
g.translate(0, d.getLogoHeight());
header.print(g);
g.translate(0, d.getTableHeaderHeight());
table.print(g);
}
@Override
public void acceptChart(ChartDimensions d, ChartModel model) {
Graphics2D g = getGraphics(d);
g.translate(d.getTreeWidth(), -d.getLogoHeight() - d.getTableHeaderHeight());
model.paint(g);
}
}