package net.sf.jasperreports.engine.design;

import net.sf.jasperreports.engine.JRDatasetRun;
import net.sf.jasperreports.engine.JRElementDataset;
import net.sf.jasperreports.engine.JRExpression;
import net.sf.jasperreports.engine.JRGroup;
import net.sf.jasperreports.engine.base.JRBaseElementDataset;
import net.sf.jasperreports.engine.base.JRBaseObjectFactory;
import net.sf.jasperreports.engine.design.events.JRChangeEventsSupport;
import net.sf.jasperreports.engine.design.events.JRPropertyChangeSupport;

public abstract class JRDesignElementDataset extends JRBaseElementDataset implements JRChangeEventsSupport {
  private static final long serialVersionUID = 10200L;
  
  public static final String PROPERTY_DATASET_RUN = "datasetRun";
  
  public static final String PROPERTY_INCREMENT_GROUP = "incrementGroup";
  
  public static final String PROPERTY_INCREMENT_TYPE = "incrementType";
  
  public static final String PROPERTY_INCREMENT_WHEN_EXPRESSION = "incrementWhenExpression";
  
  public static final String PROPERTY_RESET_GROUP = "resetGroup";
  
  public static final String PROPERTY_RESET_TYPE = "resetType";
  
  private transient JRPropertyChangeSupport eventSupport;
  
  public JRDesignElementDataset() {}
  
  public JRDesignElementDataset(JRElementDataset dataset) {
    super(dataset);
  }
  
  public JRDesignElementDataset(JRElementDataset dataset, JRBaseObjectFactory factory) {
    super(dataset, factory);
  }
  
  public void setResetType(byte resetType) {
    byte old = this.resetType;
    this.resetType = resetType;
    getEventSupport().firePropertyChange("resetType", old, this.resetType);
  }
  
  public void setIncrementType(byte incrementType) {
    byte old = this.incrementType;
    this.incrementType = incrementType;
    getEventSupport().firePropertyChange("incrementType", old, this.incrementType);
  }
  
  public void setResetGroup(JRGroup group) {
    Object old = this.resetGroup;
    this.resetGroup = group;
    getEventSupport().firePropertyChange("resetGroup", old, this.resetGroup);
  }
  
  public void setIncrementGroup(JRGroup group) {
    Object old = this.incrementGroup;
    this.incrementGroup = group;
    getEventSupport().firePropertyChange("incrementGroup", old, this.incrementGroup);
  }
  
  public void setDatasetRun(JRDatasetRun datasetRun) {
    Object old = this.datasetRun;
    this.datasetRun = datasetRun;
    getEventSupport().firePropertyChange("datasetRun", old, this.datasetRun);
  }
  
  public void setIncrementWhenExpression(JRExpression expression) {
    Object old = this.incrementWhenExpression;
    this.incrementWhenExpression = expression;
    getEventSupport().firePropertyChange("incrementWhenExpression", old, this.incrementWhenExpression);
  }
  
  public JRPropertyChangeSupport getEventSupport() {
    synchronized (this) {
      if (this.eventSupport == null)
        this.eventSupport = new JRPropertyChangeSupport(this); 
    } 
    return this.eventSupport;
  }
}
