package net.sf.jasperreports.engine.base;

import java.io.Serializable;
import net.sf.jasperreports.engine.JRExpression;
import net.sf.jasperreports.engine.JRHyperlink;
import net.sf.jasperreports.engine.JRHyperlinkHelper;
import net.sf.jasperreports.engine.JRHyperlinkParameter;
import net.sf.jasperreports.engine.JRRuntimeException;

public class JRBaseHyperlink implements JRHyperlink, Serializable {
  private static final long serialVersionUID = 10200L;
  
  protected String linkType;
  
  protected byte hyperlinkTarget = 1;
  
  protected JRExpression hyperlinkReferenceExpression;
  
  protected JRExpression hyperlinkAnchorExpression;
  
  protected JRExpression hyperlinkPageExpression;
  
  protected JRExpression hyperlinkTooltipExpression;
  
  protected JRHyperlinkParameter[] hyperlinkParameters;
  
  public JRBaseHyperlink() {}
  
  protected JRBaseHyperlink(JRHyperlink link, JRBaseObjectFactory factory) {
    factory.put(link, this);
    this.linkType = link.getLinkType();
    this.hyperlinkTarget = link.getHyperlinkTarget();
    this.hyperlinkReferenceExpression = factory.getExpression(link.getHyperlinkReferenceExpression());
    this.hyperlinkAnchorExpression = factory.getExpression(link.getHyperlinkAnchorExpression());
    this.hyperlinkPageExpression = factory.getExpression(link.getHyperlinkPageExpression());
    this.hyperlinkTooltipExpression = factory.getExpression(link.getHyperlinkTooltipExpression());
    this.hyperlinkParameters = copyHyperlinkParameters(link, factory);
  }
  
  public static JRHyperlinkParameter[] copyHyperlinkParameters(JRHyperlink link, JRBaseObjectFactory factory) {
    JRHyperlinkParameter[] linkParameters = link.getHyperlinkParameters();
    JRHyperlinkParameter[] parameters = null;
    if (linkParameters != null && linkParameters.length > 0) {
      parameters = new JRHyperlinkParameter[linkParameters.length];
      for (int i = 0; i < linkParameters.length; i++) {
        JRHyperlinkParameter parameter = linkParameters[i];
        parameters[i] = factory.getHyperlinkParameter(parameter);
      } 
    } 
    return parameters;
  }
  
  public JRExpression getHyperlinkAnchorExpression() {
    return this.hyperlinkAnchorExpression;
  }
  
  public JRExpression getHyperlinkPageExpression() {
    return this.hyperlinkPageExpression;
  }
  
  public JRHyperlinkParameter[] getHyperlinkParameters() {
    return this.hyperlinkParameters;
  }
  
  public JRExpression getHyperlinkReferenceExpression() {
    return this.hyperlinkReferenceExpression;
  }
  
  public byte getHyperlinkTarget() {
    return this.hyperlinkTarget;
  }
  
  public byte getHyperlinkType() {
    return JRHyperlinkHelper.getHyperlinkType(this);
  }
  
  public String getLinkType() {
    return this.linkType;
  }
  
  public JRExpression getHyperlinkTooltipExpression() {
    return this.hyperlinkTooltipExpression;
  }
  
  public Object clone() {
    JRBaseHyperlink clone = null;
    try {
      clone = (JRBaseHyperlink)super.clone();
    } catch (CloneNotSupportedException e) {
      throw new JRRuntimeException(e);
    } 
    if (this.hyperlinkParameters != null) {
      clone.hyperlinkParameters = new JRHyperlinkParameter[this.hyperlinkParameters.length];
      for (int i = 0; i < this.hyperlinkParameters.length; i++)
        clone.hyperlinkParameters[i] = (JRHyperlinkParameter)this.hyperlinkParameters[i].clone(); 
    } 
    if (this.hyperlinkReferenceExpression != null)
      clone.hyperlinkReferenceExpression = (JRExpression)this.hyperlinkReferenceExpression.clone(); 
    if (this.hyperlinkAnchorExpression != null)
      clone.hyperlinkAnchorExpression = (JRExpression)this.hyperlinkAnchorExpression.clone(); 
    if (this.hyperlinkPageExpression != null)
      clone.hyperlinkPageExpression = (JRExpression)this.hyperlinkPageExpression.clone(); 
    if (this.hyperlinkTooltipExpression != null)
      clone.hyperlinkTooltipExpression = (JRExpression)this.hyperlinkTooltipExpression.clone(); 
    return clone;
  }
}
