package net.sf.jasperreports.engine.fill;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExpressionCollector;
import net.sf.jasperreports.engine.JRPrintElement;
import net.sf.jasperreports.engine.JRStaticText;
import net.sf.jasperreports.engine.JRStyle;
import net.sf.jasperreports.engine.JRTextElement;
import net.sf.jasperreports.engine.JRVisitor;

public class JRFillStaticText extends JRFillTextElement implements JRStaticText {
  protected JRFillStaticText(JRBaseFiller filler, JRStaticText staticText, JRFillObjectFactory factory) {
    super(filler, (JRTextElement)staticText, factory);
    String text = processMarkupText(staticText.getText());
    if (text == null)
      text = ""; 
    setRawText(text);
  }
  
  protected JRFillStaticText(JRFillStaticText staticText, JRFillCloneFactory factory) {
    super(staticText, factory);
    String text = processMarkupText(staticText.getText());
    if (text == null)
      text = ""; 
    setRawText(text);
  }
  
  public void setText(String text) {}
  
  protected JRTemplateText getJRTemplateText() {
    JRStyle style = getStyle();
    JRTemplateText template = (JRTemplateText)getTemplate(style);
    if (template == null) {
      template = new JRTemplateText((this.band == null) ? null : this.band.getOrigin(), this.filler.getJasperPrint().getDefaultStyleProvider(), this);
      transferProperties(template);
      registerTemplate(style, template);
    } 
    return template;
  }
  
  protected void evaluate(byte evaluation) throws JRException {
    reset();
    evaluatePrintWhenExpression(evaluation);
    evaluateProperties(evaluation);
    setTextStart(0);
    setTextEnd(0);
    setValueRepeating(true);
  }
  
  protected boolean prepare(int availableStretchHeight, boolean isOverflow) throws JRException {
    boolean willOverflow = false;
    super.prepare(availableStretchHeight, isOverflow);
    if (!isToPrint())
      return willOverflow; 
    boolean isToPrint = true;
    boolean isReprinted = false;
    if (isOverflow && isAlreadyPrinted() && !isPrintWhenDetailOverflows())
      isToPrint = false; 
    if (isToPrint && isPrintWhenExpressionNull() && !isPrintRepeatedValues())
      if ((!isPrintInFirstWholeBand() || !getBand().isFirstWholeOnPageColumn()) && (getPrintWhenGroupChanges() == null || !getBand().isNewGroup(getPrintWhenGroupChanges())) && (!isOverflow || !isPrintWhenDetailOverflows()))
        isToPrint = false;  
    if (isToPrint && availableStretchHeight < getRelativeY() - getY() - getBandBottomY()) {
      isToPrint = false;
      willOverflow = true;
    } 
    if (isToPrint && isOverflow && isPrintWhenDetailOverflows() && (isAlreadyPrinted() || (!isAlreadyPrinted() && !isPrintRepeatedValues())))
      isReprinted = true; 
    setTextStart(0);
    setTextEnd(0);
    if (isToPrint)
      chopTextElement(0); 
    setToPrint(isToPrint);
    setReprinted(isReprinted);
    return willOverflow;
  }
  
  protected JRPrintElement fill() {
    JRTemplatePrintText text = new JRTemplatePrintText(getJRTemplateText());
    text.setX(getX());
    text.setY(getRelativeY());
    text.setWidth(getWidth());
    if (getRotation() == 0) {
      text.setHeight(getStretchHeight());
    } else {
      text.setHeight(getHeight());
    } 
    text.setRunDirection(getRunDirection());
    text.setLineSpacingFactor(getLineSpacingFactor());
    text.setLeadingOffset(getLeadingOffset());
    text.setTextHeight(getTextHeight());
    transferProperties(text);
    setPrintText(text);
    return text;
  }
  
  public void collectExpressions(JRExpressionCollector collector) {
    collector.collect(this);
  }
  
  public void visit(JRVisitor visitor) {
    visitor.visitStaticText(this);
  }
  
  protected void resolveElement(JRPrintElement element, byte evaluation) {}
  
  public JRFillCloneable createClone(JRFillCloneFactory factory) {
    return new JRFillStaticText(this, factory);
  }
  
  protected boolean canOverflow() {
    return false;
  }
}
