//---------------------------------------------------------------------------
// MyPrint.class - Eric Pence, 1999
// Displays the print dialog and invokes the Painter object's print() method.
// The Vector to be printed is formatted in the calling applet.
//---------------------------------------------------------------------------
import java.awt.*;
import java.awt.print.*;
import java.util.*;

public class MyPrint {

  public MyPrint() {}

  public void printReport(Vector v) {
    try {
      PrinterJob job = PrinterJob.getPrinterJob();
      job.setPrintable(new PrintListing(v));
      if (job.printDialog() == true) {
        // Print the job if the user didn't cancel printing
        job.print();
      }
    } catch (Exception e) {
      System.out.println("Exception in printReport()");
      e.printStackTrace();
    }
  }
}

//---------------------------------------------------------------------------
// PrintListing.class - Eric Pence, 1999
// Prints a set of pages from the elements in the passed Vector.
//---------------------------------------------------------------------------
import java.awt.*;
import java.awt.print.*;
import java.util.*;

class PrintListing implements Printable {
    private int rememberedPageIndex = -1;
    private int cl = 0;
    private Font fontBold = null;
    private Font fontPlain = null;
    private int inch = 0;
    private int line = 0;
    private boolean rememberedEOF = false;
    private int y = 0;
    private int v = 0;
    private Vector vrs;

  public PrintListing(Vector vec) {
    vrs = vec;
  }

  public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException {
    fontPlain = new Font("Courier", Font.PLAIN, 10);
    fontBold = new Font("Courier", Font.BOLD, 10);
    String a[] = new String[9];

    try {
      if (pageIndex != rememberedPageIndex) {
        // First time we've visited this page
        rememberedPageIndex = pageIndex;
        if (rememberedEOF == true) return Printable.NO_SUCH_PAGE;
        // Each page comes from PrinterJob twice, only format once.
        return Printable.PAGE_EXISTS;
      }

      // Calculate and store the width of a column based on the printable area of a page,
      //   and multiply this value by each column position to locate the print output.
      int columnsPerPage = 80;
      double imageWidth = pf.getImageableWidth();
      cl = (int) (imageWidth / columnsPerPage);

      // Page units are 1/72 inch.
      // One line = 12 units.
      // Printable image area starts at 1 inch from left, 1 inch from top (x=72, y=72)
      line = 12;
      inch = 72;
      y = inch + line ;

      boolean headingsPrinted = false;
      boolean pagePrinted = false;
      if (pageIndex == 0) v = 0;

      // Print a page.
      while ((y + (line * 3) < pf.getImageableY() + pf.getImageableHeight())) {

        if (v >= vrs.size()) {
          rememberedEOF = true;
          break;
        }

        // Print headings before printing a line.
        if (headingsPrinted == false) {
          printHeadings(g);
          headingsPrinted = true;
        }

        a = (String[]) vrs.elementAt(v);
        g.drawString(a[0], inch, y);
        g.drawString(a[1], inch + (cl * 15), y);
        g.drawString(a[2], inch + (cl * 28), y);
        g.drawString(a[3], inch + (cl * 33), y);
        g.drawString(a[4], inch + (cl * 46), y);
        g.drawString(a[5], inch + (cl * 51), y);
        g.drawString(a[6], inch + (cl * 56), y);
        g.drawString(a[7], inch + (cl * 61), y);
        g.drawString(a[8], inch + (cl * 67), y);

        pagePrinted = true;
        y += line;
        v++;
        }
      }

      if (pagePrinted) {
        y = (line * 60);
        g.drawString("" + (pageIndex + 1), inch + (cl * 44), y);
      }

      return Printable.PAGE_EXISTS;

    } catch (Exception e) {
      System.out.println("Exception in print()");
      e.printStackTrace();
      return Printable.NO_SUCH_PAGE;
    }
  }

  // Print report headings.
  public void printHeadings(Graphics g) {
    try {
      g.setFont(fontBold);
      g.drawString("My Report Title", inch + (cl * 35), y);
      y += (line * 2);
      g.drawString("Column0", inch, y);
      g.drawString("Column1", inch + (cl * 15), y);
      g.drawString("Column2", inch + (cl * 28), y);
      g.drawString("Column3", inch + (cl * 33), y);
      g.drawString("Column4", inch + (cl * 46), y);
      g.drawString("Column5", inch + (cl * 51), y);
      g.drawString("Column6", inch + (cl * 56), y);
      g.drawString("Column7", inch + (cl * 61), y);
      g.drawString("Column8", inch + (cl * 67), y);
      g.setFont(fontPlain);
      y += (line * 2);
    } catch (Exception e) {
      System.out.println("Exception in printHeadings()");
      e.printStackTrace();
    }
  }

}