package net.sf.jasperreports.engine.design;

import net.sf.jasperreports.engine.JRExpression;
import net.sf.jasperreports.engine.JRGroup;
import net.sf.jasperreports.engine.base.JRBaseVariable;
import net.sf.jasperreports.engine.design.events.JRChangeEventsSupport;
import net.sf.jasperreports.engine.design.events.JRPropertyChangeSupport;

public class JRDesignVariable extends JRBaseVariable implements JRChangeEventsSupport {
  private static final long serialVersionUID = 10200L;
  
  public static final String PROPERTY_CALCULATION = "calculation";
  
  public static final String PROPERTY_EXPRESSION = "expression";
  
  public static final String PROPERTY_INCREMENTER_FACTORY_CLASS_NAME = "incrementerFactoryClassName";
  
  public static final String PROPERTY_INCREMENT_GROUP = "incrementGroup";
  
  public static final String PROPERTY_INCREMENT_TYPE = "incrementType";
  
  public static final String PROPERTY_INITIAL_VALUE_EXPRESSION = "initialValueExpression";
  
  public static final String PROPERTY_NAME = "name";
  
  public static final String PROPERTY_RESET_GROUP = "resetGroup";
  
  public static final String PROPERTY_RESET_TYPE = "resetType";
  
  public static final String PROPERTY_SYSTEM_DEFINED = "systemDefined";
  
  public static final String PROPERTY_VALUE_CLASS_NAME = "valueClassName";
  
  private transient JRPropertyChangeSupport eventSupport;
  
  public void setName(String name) {
    String old = this.name;
    this.name = name;
    getEventSupport().firePropertyChange("name", old, this.name);
  }
  
  public void setValueClass(Class clazz) {
    setValueClassName(clazz.getName());
  }
  
  public void setValueClassName(String className) {
    Object old = this.valueClassName;
    this.valueClassName = className;
    this.valueClass = null;
    this.valueClassRealName = null;
    getEventSupport().firePropertyChange("valueClassName", old, this.valueClassName);
  }
  
  public void setIncrementerFactoryClass(Class clazz) {
    setIncrementerFactoryClassName(clazz.getName());
  }
  
  public void setIncrementerFactoryClassName(String className) {
    Object old = this.incrementerFactoryClassName;
    this.incrementerFactoryClassName = className;
    this.incrementerFactoryClass = null;
    this.incrementerFactoryClassRealName = null;
    getEventSupport().firePropertyChange("incrementerFactoryClassName", old, this.incrementerFactoryClassName);
  }
  
  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 setCalculation(byte calculation) {
    byte old = this.calculation;
    this.calculation = calculation;
    getEventSupport().firePropertyChange("calculation", old, this.calculation);
  }
  
  public void setSystemDefined(boolean isSystemDefined) {
    boolean old = this.isSystemDefined;
    this.isSystemDefined = isSystemDefined;
    getEventSupport().firePropertyChange("systemDefined", old, this.isSystemDefined);
  }
  
  public void setExpression(JRExpression expression) {
    Object old = this.expression;
    this.expression = expression;
    getEventSupport().firePropertyChange("expression", old, this.expression);
  }
  
  public void setInitialValueExpression(JRExpression expression) {
    Object old = this.initialValueExpression;
    this.initialValueExpression = expression;
    getEventSupport().firePropertyChange("initialValueExpression", old, this.initialValueExpression);
  }
  
  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 JRPropertyChangeSupport getEventSupport() {
    synchronized (this) {
      if (this.eventSupport == null)
        this.eventSupport = new JRPropertyChangeSupport(this); 
    } 
    return this.eventSupport;
  }
}
