package net.sf.jasperreports.engine.base;

import java.io.Serializable;
import net.sf.jasperreports.engine.JRBand;
import net.sf.jasperreports.engine.JRExpression;
import net.sf.jasperreports.engine.JRGroup;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.JRVariable;
import net.sf.jasperreports.engine.design.events.JRChangeEventsSupport;
import net.sf.jasperreports.engine.design.events.JRPropertyChangeSupport;

public class JRBaseGroup implements JRGroup, Serializable, JRChangeEventsSupport {
  private static final long serialVersionUID = 10200L;
  
  public static final String PROPERTY_MIN_HEIGHT_TO_START_NEW_PAGE = "minHeightToStartNewPage";
  
  public static final String PROPERTY_RESET_PAGE_NUMBER = "resetPageNumber";
  
  public static final String PROPERTY_REPRINT_HEADER_ON_EACH_PAGE = "reprintHeaderOnEachPage";
  
  public static final String PROPERTY_START_NEW_COLUMN = "startNewColumn";
  
  public static final String PROPERTY_START_NEW_PAGE = "startNewPage";
  
  protected String name = null;
  
  protected boolean isStartNewColumn = false;
  
  protected boolean isStartNewPage = false;
  
  protected boolean isResetPageNumber = false;
  
  protected boolean isReprintHeaderOnEachPage = false;
  
  protected int minHeightToStartNewPage = 0;
  
  protected JRExpression expression = null;
  
  protected JRBand groupHeader = null;
  
  protected JRBand groupFooter = null;
  
  protected JRVariable countVariable = null;
  
  private transient JRPropertyChangeSupport eventSupport;
  
  protected JRBaseGroup() {}
  
  protected JRBaseGroup(JRGroup group, JRBaseObjectFactory factory) {
    factory.put(group, this);
    this.name = group.getName();
    this.isStartNewColumn = group.isStartNewColumn();
    this.isStartNewPage = group.isStartNewPage();
    this.isResetPageNumber = group.isResetPageNumber();
    this.isReprintHeaderOnEachPage = group.isReprintHeaderOnEachPage();
    this.minHeightToStartNewPage = group.getMinHeightToStartNewPage();
    this.expression = factory.getExpression(group.getExpression());
    this.groupHeader = factory.getBand(group.getGroupHeader());
    this.groupFooter = factory.getBand(group.getGroupFooter());
    this.countVariable = factory.getVariable(group.getCountVariable());
  }
  
  public String getName() {
    return this.name;
  }
  
  public boolean isStartNewColumn() {
    return this.isStartNewColumn;
  }
  
  public void setStartNewColumn(boolean isStart) {
    boolean old = this.isStartNewColumn;
    this.isStartNewColumn = isStart;
    getEventSupport().firePropertyChange("startNewColumn", old, this.isStartNewColumn);
  }
  
  public boolean isStartNewPage() {
    return this.isStartNewPage;
  }
  
  public void setStartNewPage(boolean isStart) {
    boolean old = this.isStartNewPage;
    this.isStartNewPage = isStart;
    getEventSupport().firePropertyChange("startNewPage", old, this.isStartNewPage);
  }
  
  public boolean isResetPageNumber() {
    return this.isResetPageNumber;
  }
  
  public void setResetPageNumber(boolean isReset) {
    boolean old = this.isResetPageNumber;
    this.isResetPageNumber = isReset;
    getEventSupport().firePropertyChange("resetPageNumber", old, this.isResetPageNumber);
  }
  
  public boolean isReprintHeaderOnEachPage() {
    return this.isReprintHeaderOnEachPage;
  }
  
  public void setReprintHeaderOnEachPage(boolean isReprint) {
    boolean old = this.isReprintHeaderOnEachPage;
    this.isReprintHeaderOnEachPage = isReprint;
    getEventSupport().firePropertyChange("reprintHeaderOnEachPage", old, this.isReprintHeaderOnEachPage);
  }
  
  public int getMinHeightToStartNewPage() {
    return this.minHeightToStartNewPage;
  }
  
  public void setMinHeightToStartNewPage(int minHeight) {
    int old = this.minHeightToStartNewPage;
    this.minHeightToStartNewPage = minHeight;
    getEventSupport().firePropertyChange("minHeightToStartNewPage", old, this.minHeightToStartNewPage);
  }
  
  public JRExpression getExpression() {
    return this.expression;
  }
  
  public JRBand getGroupHeader() {
    return this.groupHeader;
  }
  
  public JRBand getGroupFooter() {
    return this.groupFooter;
  }
  
  public JRVariable getCountVariable() {
    return this.countVariable;
  }
  
  public Object clone() {
    JRBaseGroup clone = null;
    try {
      clone = (JRBaseGroup)super.clone();
    } catch (CloneNotSupportedException e) {
      throw new JRRuntimeException(e);
    } 
    if (this.expression != null)
      clone.expression = (JRExpression)this.expression.clone(); 
    if (this.groupHeader != null)
      clone.groupHeader = (JRBand)this.groupHeader.clone(); 
    if (this.groupFooter != null)
      clone.groupFooter = (JRBand)this.groupFooter.clone(); 
    if (this.countVariable != null)
      clone.countVariable = (JRVariable)this.countVariable.clone(); 
    return clone;
  }
  
  public JRPropertyChangeSupport getEventSupport() {
    synchronized (this) {
      if (this.eventSupport == null)
        this.eventSupport = new JRPropertyChangeSupport(this); 
    } 
    return this.eventSupport;
  }
}
