package net.sf.jasperreports.engine.fill;

import java.awt.Color;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import net.sf.jasperreports.engine.JRDefaultStyleProvider;
import net.sf.jasperreports.engine.JROrigin;
import net.sf.jasperreports.engine.JRPrintElement;
import net.sf.jasperreports.engine.JRPropertiesHolder;
import net.sf.jasperreports.engine.JRPropertiesMap;
import net.sf.jasperreports.engine.JRStyle;

public class JRTemplatePrintElement implements JRPrintElement, Serializable {
  private static final long serialVersionUID = 10200L;
  
  protected JRTemplateElement template = null;
  
  private int x = 0;
  
  private int y = 0;
  
  private int height = 0;
  
  private int width = 0;
  
  private JRPropertiesMap properties;
  
  protected JRTemplatePrintElement(JRTemplateElement element) {
    this.template = element;
  }
  
  public JRDefaultStyleProvider getDefaultStyleProvider() {
    return this.template.getDefaultStyleProvider();
  }
  
  public JROrigin getOrigin() {
    return this.template.getOrigin();
  }
  
  public JRStyle getStyle() {
    return this.template.getStyle();
  }
  
  public void setStyle(JRStyle style) {}
  
  public byte getMode() {
    return this.template.getMode();
  }
  
  public Byte getOwnMode() {
    return this.template.getOwnMode();
  }
  
  public void setMode(byte mode) {}
  
  public void setMode(Byte mode) {}
  
  public int getX() {
    return this.x;
  }
  
  public void setX(int x) {
    this.x = x;
  }
  
  public int getY() {
    return this.y;
  }
  
  public void setY(int y) {
    this.y = y;
  }
  
  public int getWidth() {
    return this.width;
  }
  
  public void setWidth(int width) {
    this.width = width;
  }
  
  public int getHeight() {
    return this.height;
  }
  
  public void setHeight(int height) {
    this.height = height;
  }
  
  public Color getForecolor() {
    return this.template.getForecolor();
  }
  
  public Color getOwnForecolor() {
    return this.template.getOwnForecolor();
  }
  
  public void setForecolor(Color color) {}
  
  public Color getBackcolor() {
    return this.template.getBackcolor();
  }
  
  public Color getOwnBackcolor() {
    return this.template.getOwnBackcolor();
  }
  
  public void setBackcolor(Color color) {}
  
  public JRTemplateElement getTemplate() {
    return this.template;
  }
  
  public void setTemplate(JRTemplateElement template) {
    this.template = template;
    if (this.properties != null)
      if (this.template != null && this.template.hasProperties()) {
        this.properties.setBaseProperties(this.template.getPropertiesMap());
      } else {
        this.properties.setBaseProperties(null);
      }  
  }
  
  public String getKey() {
    return this.template.getKey();
  }
  
  public String getStyleNameReference() {
    return null;
  }
  
  public Color getDefaultLineColor() {
    return getForecolor();
  }
  
  public synchronized boolean hasProperties() {
    return ((this.properties != null && this.properties.hasProperties()) || this.template.hasProperties());
  }
  
  public synchronized JRPropertiesMap getPropertiesMap() {
    if (this.properties == null) {
      this.properties = new JRPropertiesMap();
      if (this.template.hasProperties())
        this.properties.setBaseProperties(this.template.getPropertiesMap()); 
    } 
    return this.properties;
  }
  
  public JRPropertiesHolder getParentProperties() {
    return null;
  }
  
  private synchronized void writeObject(ObjectOutputStream out) throws IOException {
    if (this.properties != null && !this.properties.hasOwnProperties())
      this.properties = null; 
    out.defaultWriteObject();
  }
}
