package net.sf.jasperreports.charts.base;

import net.sf.jasperreports.charts.JRTimeSeries;
import net.sf.jasperreports.charts.JRTimeSeriesDataset;
import net.sf.jasperreports.engine.JRChartDataset;
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;
import net.sf.jasperreports.engine.design.events.JRChangeEventsSupport;
import net.sf.jasperreports.engine.design.events.JRPropertyChangeSupport;

public class JRBaseTimeSeriesDataset extends JRBaseChartDataset implements JRTimeSeriesDataset, JRChangeEventsSupport {
  private static final long serialVersionUID = 10200L;
  
  public static final String PROPERTY_TIME_PERIOD = "timePeriod";
  
  private JRTimeSeries[] timeSeries = null;
  
  private Class timePeriod;
  
  private transient JRPropertyChangeSupport eventSupport;
  
  protected JRBaseTimeSeriesDataset(JRTimeSeriesDataset dataset) {
    super((JRChartDataset)dataset);
  }
  
  public JRBaseTimeSeriesDataset(JRTimeSeriesDataset dataset, JRBaseObjectFactory factory) {
    super((JRChartDataset)dataset, factory);
    this.timePeriod = dataset.getTimePeriod();
    JRTimeSeries[] srcTimeSeries = dataset.getSeries();
    if (srcTimeSeries != null && srcTimeSeries.length > 0) {
      this.timeSeries = new JRTimeSeries[srcTimeSeries.length];
      for (int i = 0; i < this.timeSeries.length; i++)
        this.timeSeries[i] = factory.getTimeSeries(srcTimeSeries[i]); 
    } 
  }
  
  public JRTimeSeries[] getSeries() {
    return this.timeSeries;
  }
  
  public Class getTimePeriod() {
    return this.timePeriod;
  }
  
  public void setTimePeriod(Class timePeriod) {
    Object old = this.timePeriod;
    this.timePeriod = timePeriod;
    getEventSupport().firePropertyChange("timePeriod", old, this.timePeriod);
  }
  
  public byte getDatasetType() {
    return 6;
  }
  
  public void collectExpressions(JRExpressionCollector collector) {
    collector.collect(this);
  }
  
  public void validate(JRVerifier verifier) {
    verifier.verify(this);
  }
  
  public Object clone() {
    JRBaseTimeSeriesDataset clone = (JRBaseTimeSeriesDataset)super.clone();
    if (this.timeSeries != null) {
      clone.timeSeries = new JRTimeSeries[this.timeSeries.length];
      for (int i = 0; i < this.timeSeries.length; i++)
        this.timeSeries[i] = (JRTimeSeries)this.timeSeries[i].clone(); 
    } 
    return clone;
  }
  
  public JRPropertyChangeSupport getEventSupport() {
    synchronized (this) {
      if (this.eventSupport == null)
        this.eventSupport = new JRPropertyChangeSupport(this); 
    } 
    return this.eventSupport;
  }
}
