package net.sf.jasperreports.charts.base;

import java.awt.Color;
import net.sf.jasperreports.charts.JRCategoryAxisFormat;
import net.sf.jasperreports.charts.JRLinePlot;
import net.sf.jasperreports.charts.JRValueAxisFormat;
import net.sf.jasperreports.engine.JRChart;
import net.sf.jasperreports.engine.JRChartPlot;
import net.sf.jasperreports.engine.JRExpression;
import net.sf.jasperreports.engine.JRExpressionCollector;
import net.sf.jasperreports.engine.JRFont;
import net.sf.jasperreports.engine.JRStyleContainer;
import net.sf.jasperreports.engine.base.JRBaseChartPlot;
import net.sf.jasperreports.engine.base.JRBaseFont;
import net.sf.jasperreports.engine.base.JRBaseObjectFactory;
import net.sf.jasperreports.engine.util.JRStyleResolver;

public class JRBaseLinePlot extends JRBaseChartPlot implements JRLinePlot {
  private static final long serialVersionUID = 10200L;
  
  public static final String PROPERTY_SHOW_LINES = "showLines";
  
  public static final String PROPERTY_SHOW_SHAPES = "showShapes";
  
  protected JRExpression categoryAxisLabelExpression = null;
  
  protected JRFont categoryAxisLabelFont = null;
  
  protected Color categoryAxisLabelColor = null;
  
  protected JRFont categoryAxisTickLabelFont = null;
  
  protected Color categoryAxisTickLabelColor = null;
  
  protected String categoryAxisTickLabelMask = null;
  
  protected Color categoryAxisLineColor = null;
  
  protected JRExpression valueAxisLabelExpression = null;
  
  protected JRFont valueAxisLabelFont = null;
  
  protected Color valueAxisLabelColor = null;
  
  protected JRFont valueAxisTickLabelFont = null;
  
  protected Color valueAxisTickLabelColor = null;
  
  protected String valueAxisTickLabelMask = null;
  
  protected Color valueAxisLineColor = null;
  
  boolean isShowShapes = true;
  
  boolean isShowLines = true;
  
  public JRBaseLinePlot(JRChartPlot linePlot, JRChart chart) {
    super(linePlot, chart);
  }
  
  public JRBaseLinePlot(JRLinePlot linePlot, JRBaseObjectFactory factory) {
    super((JRChartPlot)linePlot, factory);
    this.isShowShapes = linePlot.isShowShapes();
    this.isShowLines = linePlot.isShowLines();
    this.categoryAxisLabelExpression = factory.getExpression(linePlot.getCategoryAxisLabelExpression());
    this.categoryAxisLabelFont = (JRFont)new JRBaseFont(null, null, (JRStyleContainer)linePlot.getChart(), linePlot.getCategoryAxisLabelFont());
    this.categoryAxisLabelColor = linePlot.getOwnCategoryAxisLabelColor();
    this.categoryAxisTickLabelFont = (JRFont)new JRBaseFont(null, null, (JRStyleContainer)linePlot.getChart(), linePlot.getCategoryAxisTickLabelFont());
    this.categoryAxisTickLabelColor = linePlot.getOwnCategoryAxisTickLabelColor();
    this.categoryAxisTickLabelMask = linePlot.getCategoryAxisTickLabelMask();
    this.categoryAxisLineColor = linePlot.getCategoryAxisLineColor();
    this.valueAxisLabelExpression = factory.getExpression(linePlot.getValueAxisLabelExpression());
    this.valueAxisLabelFont = (JRFont)new JRBaseFont(null, null, (JRStyleContainer)linePlot.getChart(), linePlot.getValueAxisLabelFont());
    this.valueAxisLabelColor = linePlot.getOwnValueAxisLabelColor();
    this.valueAxisTickLabelFont = (JRFont)new JRBaseFont(null, null, (JRStyleContainer)linePlot.getChart(), linePlot.getValueAxisTickLabelFont());
    this.valueAxisTickLabelColor = linePlot.getOwnValueAxisTickLabelColor();
    this.valueAxisTickLabelMask = linePlot.getValueAxisTickLabelMask();
    this.valueAxisLineColor = linePlot.getValueAxisLineColor();
  }
  
  public JRExpression getCategoryAxisLabelExpression() {
    return this.categoryAxisLabelExpression;
  }
  
  public JRFont getCategoryAxisLabelFont() {
    return this.categoryAxisLabelFont;
  }
  
  public Color getCategoryAxisLabelColor() {
    return JRStyleResolver.getCategoryAxisLabelColor((JRCategoryAxisFormat)this, (JRChartPlot)this);
  }
  
  public Color getOwnCategoryAxisLabelColor() {
    return this.categoryAxisLabelColor;
  }
  
  public JRFont getCategoryAxisTickLabelFont() {
    return this.categoryAxisTickLabelFont;
  }
  
  public Color getCategoryAxisTickLabelColor() {
    return JRStyleResolver.getCategoryAxisTickLabelColor((JRCategoryAxisFormat)this, (JRChartPlot)this);
  }
  
  public Color getOwnCategoryAxisTickLabelColor() {
    return this.categoryAxisTickLabelColor;
  }
  
  public String getCategoryAxisTickLabelMask() {
    return this.categoryAxisTickLabelMask;
  }
  
  public Color getCategoryAxisLineColor() {
    return JRStyleResolver.getCategoryAxisLineColor((JRCategoryAxisFormat)this, (JRChartPlot)this);
  }
  
  public Color getOwnCategoryAxisLineColor() {
    return this.categoryAxisLineColor;
  }
  
  public JRExpression getValueAxisLabelExpression() {
    return this.valueAxisLabelExpression;
  }
  
  public JRFont getValueAxisLabelFont() {
    return this.valueAxisLabelFont;
  }
  
  public Color getValueAxisLabelColor() {
    return JRStyleResolver.getValueAxisLabelColor((JRValueAxisFormat)this, (JRChartPlot)this);
  }
  
  public Color getOwnValueAxisLabelColor() {
    return this.valueAxisLabelColor;
  }
  
  public JRFont getValueAxisTickLabelFont() {
    return this.valueAxisTickLabelFont;
  }
  
  public Color getValueAxisTickLabelColor() {
    return JRStyleResolver.getValueAxisTickLabelColor((JRValueAxisFormat)this, (JRChartPlot)this);
  }
  
  public Color getOwnValueAxisTickLabelColor() {
    return this.valueAxisTickLabelColor;
  }
  
  public String getValueAxisTickLabelMask() {
    return this.valueAxisTickLabelMask;
  }
  
  public Color getValueAxisLineColor() {
    return JRStyleResolver.getValueAxisLineColor((JRValueAxisFormat)this, (JRChartPlot)this);
  }
  
  public Color getOwnValueAxisLineColor() {
    return this.valueAxisLineColor;
  }
  
  public boolean isShowShapes() {
    return this.isShowShapes;
  }
  
  public boolean isShowLines() {
    return this.isShowLines;
  }
  
  public void setShowShapes(boolean value) {
    boolean old = this.isShowShapes;
    this.isShowShapes = value;
    getEventSupport().firePropertyChange("showShapes", old, this.isShowShapes);
  }
  
  public void setShowLines(boolean value) {
    boolean old = this.isShowLines;
    this.isShowLines = value;
    getEventSupport().firePropertyChange("showShapes", old, this.isShowLines);
  }
  
  public void collectExpressions(JRExpressionCollector collector) {
    collector.collect(this);
  }
  
  public Object clone(JRChart parentChart) {
    JRBaseLinePlot clone = (JRBaseLinePlot)super.clone(parentChart);
    if (this.categoryAxisLabelExpression != null)
      clone.categoryAxisLabelExpression = (JRExpression)this.categoryAxisLabelExpression.clone(); 
    if (this.valueAxisLabelExpression != null)
      clone.valueAxisLabelExpression = (JRExpression)this.valueAxisLabelExpression.clone(); 
    return clone;
  }
}
