package simpleScope;

import jafama.FastMath;

import java.awt.Color;
import java.awt.Font;
import java.text.ChoiceFormat;
import java.text.DecimalFormat;
import java.text.FieldPosition;
import java.text.MessageFormat;
import java.text.NumberFormat;
import java.text.ParsePosition;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.labels.XYToolTipGenerator;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.chart.urls.StandardXYURLGenerator;
import org.jfree.chart.urls.XYURLGenerator;
import org.jfree.data.Range;
import org.jfree.data.general.Dataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.experimental.chart.swt.ChartComposite;
import org.jfree.ui.RectangleInsets;

import otherSupport.ScientificNumberFormat;

public class JFreeChartGraph {
	
	private ChartComposite frame;
	private XYPlot plot;
	
	private NumberAxis xAxis;
	private NumberAxis valueAxis;
	     
    public JFreeChartGraph(Composite parent, int style, XYDataset dataset){
    	init(parent, style, dataset);
    }
    
    private void init(Composite parent, int style, XYDataset dataset){
            
        
        StandardChartTheme currentTheme = new StandardChartTheme("JFree");
        
        ScientificNumberFormat format = new ScientificNumberFormat();
        //format.
        
        xAxis = new NumberAxis(null);
        xAxis.setLowerMargin(0.00);  // reduce the default margins
        xAxis.setUpperMargin(0.00);
        xAxis.setAutoRangeIncludesZero(false);  // override default
        xAxis.setNumberFormatOverride(format);
        
        valueAxis = new NumberAxis(null);
        valueAxis.setLowerMargin(0.10);  // reduce the default margins
        valueAxis.setUpperMargin(0.10);
        valueAxis.setAutoRangeIncludesZero(false);  // override default
        valueAxis.setNumberFormatOverride(format);
        
        plot = new XYPlot(dataset, xAxis, valueAxis, null);

        XYToolTipGenerator toolTipGenerator = StandardXYToolTipGenerator.getTimeSeriesInstance();

        XYURLGenerator urlGenerator = new StandardXYURLGenerator();

        XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(true, false);
        renderer.setBaseToolTipGenerator(toolTipGenerator);
        renderer.setURLGenerator(urlGenerator);
        renderer.setSeriesPaint(0, Color.BLACK);
        renderer.setSeriesPaint(1, Color.BLUE);
        renderer.setSeriesPaint(2, Color.RED);
        renderer.setSeriesPaint(3, Color.GREEN);
        plot.setRenderer(renderer);

        JFreeChart chart = new JFreeChart(null, JFreeChart.DEFAULT_TITLE_FONT, plot, false);
        currentTheme.apply(chart);
        
        chart.setBackgroundPaint(Color.white);
        chart.setBorderVisible(true);
        chart.setBorderPaint(Color.BLACK);
        
        
        plot.setOrientation(PlotOrientation.VERTICAL);
        plot.setBackgroundPaint(Color.lightGray);
        plot.setDomainGridlinePaint(Color.white);
        plot.setRangeGridlinePaint(Color.white);
        
        
        plot.setAxisOffset(new RectangleInsets(0.0, 0.0, 0.0, 0.0));
       
        renderer.setSeriesPaint(0, Color.black);
        
        
       
        frame = new ChartComposite(parent, SWT.NONE, chart, 
        		300,300,
        		10, 10, 1000, 1000, true, true, true, true, true, true);
        frame.setDisplayToolTips(true);
        frame.setHorizontalAxisTrace(true);
        frame.setVerticalAxisTrace(true);
        frame.addListener(SWT.Resize, new Listener() { @Override public void handleEvent(Event event) { resizeEvent(event); } });
        
        chart.setPadding(new RectangleInsets(0.0, 0.0, 0.0, 0.0));
        plot.setInsets(new RectangleInsets(0.0, 0.0, 0.0, 0.0));
        xAxis.setTickLabelInsets(new RectangleInsets(0.0, 0.0, 0.0, 0.0));
        valueAxis.setTickLabelInsets(new RectangleInsets(0.0, 4.0, 0.0, 0.0));
        
        Font f = xAxis.getTickLabelFont().deriveFont(10.0f);
        xAxis.setTickLabelFont(f);
        valueAxis.setTickLabelFont(f);
                
    }
    
    public void resizeEvent(Event event){
    	frame.layout();
    }
    
    public ChartComposite getComposite() { return frame; }
    
    public void setAutoRangeIncludesZero(boolean autoRangeIncludesZero){
    	valueAxis.setAutoRangeIncludesZero(autoRangeIncludesZero);
    }

	public void setDataset(XYDataset dataset) {
		plot.setDataset(dataset);
	}

	public static void main(String[] args) {
		
		
		Display display = new Display();
		
		Shell swtShell = new Shell(display, SWT.RESIZE | SWT.DIALOG_TRIM);
		swtShell.setText("Image [init]");
		
        swtShell.setLayout(new FillLayout());
        
        JFreeChartGraph graph = new JFreeChartGraph(swtShell, SWT.NONE, null);
        
       
        swtShell.pack();  
        
        swtShell.setSize(500, 500);
        
        swtShell.open();
       
       
		//long tLast = System.currentTimeMillis();
        //int nDraw = 0;
        while (display.getShells().length > 0) {
        	try{
	          if (!display.readAndDispatch()) {		        	
	            display.sleep();
	            
	          }
        	}catch(Throwable err){
        		System.err.println("Caught throwable in SWT main message loop:");
        		err.printStackTrace();
        	}
        }
	
	}
   
}
