/*
 * Created on 04.12.2005
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package net.sourceforge.ganttproject.chart;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DirectColorModel;
import java.awt.image.Raster;
import java.awt.image.SampleModel;
import java.util.List;

import net.sourceforge.ganttproject.GanttGraphicArea;
import net.sourceforge.ganttproject.GanttGraphicArea.ChartImplementation;

public abstract class RenderedChartImage extends SimpleRenderedImage {

    private BufferedImage myTaskImage;
    ColorModel myColorModel = new DirectColorModel(32,
            0x00ff0000, // Red
            0x0000ff00, // Green
            0x000000ff, // Blue
            0x0           // Alpha
            );
    SampleModel mySampleModel;
    //private final List myVisibleTasks;
	private int myCurrentTile = -1;
	private Raster myCurrentRaster;
	private final ChartModelBase myChartModel;
	
    public RenderedChartImage(ChartModelBase chartModel, BufferedImage taskImage, int chartWidth, int chartHeight) {
    	myChartModel = chartModel;
        myTaskImage = taskImage;
        sampleModel = myColorModel.createCompatibleSampleModel(chartWidth,chartHeight);
        colorModel = myColorModel;
        minX = 0;
        minY = 0;
        width = chartWidth+taskImage.getWidth();
        height = chartHeight;
        tileWidth = width;
        tileHeight = 32;
    }


    public BufferedImage getWholeImage() {
		BufferedImage chartImage = getChart(0, 0, getWidth(), getHeight(), getWidth(), getHeight());
        BufferedImage result = new BufferedImage(chartImage.getWidth()+myTaskImage.getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
        Graphics g = result.getGraphics();
        g.drawImage(myTaskImage,0,0,null);
        g.translate(myTaskImage.getWidth(), 0);
        g.drawImage(chartImage, 0,0,null);
        return result;
	}


	public Raster getTile(int tileX, int tileY) {
		if (myCurrentTile!=tileY) {
            int offsety = tileY*getTileHeight();
            BufferedImage tile = getChart(myTaskImage.getWidth(), offsety, getTileWidth(),getTileHeight(),  getWidth(), getHeight());
            Graphics g = tile.getGraphics();
            g.translate(0, -offsety);
            g.drawImage(myTaskImage,0,0,null);
            myCurrentRaster = tile.getRaster().createTranslatedChild(0, tileY*getTileHeight());
            myCurrentTile = tileY;
		}
		return myCurrentRaster;
    }

    protected abstract void paintChart(Graphics g);
    
    private BufferedImage getChart(int offsetx, int offsety,  int width, int height, int chartWidth, int chartHeight) {
        BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB );
        Graphics g2 = result.getGraphics();
        g2.setColor(Color.white);
        g2.fillRect(0, 0, width,height);
        g2.translate(offsetx, -offsety);
        g2.clipRect(0,offsety,width,height);
        myChartModel.setBounds(new Dimension(chartWidth, chartHeight));
        paintChart(g2);
        //myChartModel.setTuningOptions(ChartModelImpl.TuningOptions.DEFAULT);
        return result;

    }
    
}