package gerling.invoices_mdb;

import java.io.*;
import java.util.*;
import java.awt.print.PrinterJob;
import java.awt.print.PrinterException;
import org.apache.fop.render.awt.AWTRenderer;
import org.apache.fop.layout.Page;



// This is stolen from PrintStarter. This is a singleton, with lazy initialisation.
  public class PrintRenderer extends AWTRenderer
  {

      //The unique instance
      private static PrintRenderer uniqueInstance;

      private static final int EVEN_AND_ALL = 0;
      private static final int EVEN = 1;
      private static final int ODD = 2;

      private int startNumber;
      private int endNumber;
      private int mode = EVEN_AND_ALL;
      private int copies = 1;
      private PrinterJob printerJob;

      
      private PrintRenderer()
      {
      	super(null);
      	// Empty constructor
      }

      public static synchronized PrintRenderer getInstance()
      {
      	if (uniqueInstance == null)
      		uniqueInstance = new PrintRenderer();
      	return uniqueInstance;
      }
      
      
      
      public void setPrinterJob(PrinterJob printerJob)
      {

        this.printerJob = printerJob;
        startNumber =  0 ;
        endNumber   = -1;

        printerJob.setPageable(this);

        mode = EVEN_AND_ALL;
        String str = System.getProperty("even");
        if (str != null)
          {

                mode = Boolean.valueOf(str).booleanValue() ? EVEN : ODD;

          }

      }



      public void stopRenderer(OutputStream outputStream)
      throws IOException {
          super.stopRenderer(outputStream);

          if(endNumber == -1)
              endNumber = getPageCount();

          Vector numbers = getInvalidPageNumbers();
          for (int i = numbers.size() - 1; i > -1; i--)
              removePage(Integer.parseInt((String)numbers.elementAt(i)));

          try {
              printerJob.print();
          } catch (PrinterException e) {
              e.printStackTrace();
              throw new IOException(
                  "Unable to print: " + e.getClass().getName() +
                  ": " + e.getMessage());
          }
      }

      public void renderPage(Page page) {
          pageWidth = (int)((float)page.getWidth() / 1000f);
          pageHeight = (int)((float)page.getHeight() / 1000f);
          super.renderPage(page);
      }


      private Vector getInvalidPageNumbers() {

          Vector vec = new Vector();
          int max = getPageCount();
          boolean isValid;
          for (int i = 0; i < max; i++) {
              isValid = true;
              if (i < startNumber || i > endNumber) {
                  isValid = false;
              } else if (mode != EVEN_AND_ALL) {
                  if (mode == EVEN && ((i + 1) % 2 != 0))
                      isValid = false;
                  else if (mode == ODD && ((i + 1) % 2 != 1))
                      isValid = false;
              }

              if (!isValid)
                  vec.add(i + "");
          }

          return vec;
      }
  }    // class PrintRenderer

