FileDocCategorySizeDatePackage
FilePageRenderer.javaAPI DocExample3426Mon Apr 05 12:03:02 BST 1999None

FilePageRenderer.java

import java.awt.*;
import java.awt.print.*;
import java.io.*;
import java.util.Vector;

import javax.swing.*;

public class FilePageRenderer
    extends JComponent
    implements Printable {
  private int mCurrentPage;
  // mLines contains all the lines of the file.
  private Vector mLines;
  // mPages is a Vector of Vectors. Each of its elements
  //   represents a single page. Each of its elements is
  //   a Vector containing Strings that are the lines for
  //   a particular page.
  private Vector mPages;
  private Font mFont;
  private int mFontSize;
  private Dimension mPreferredSize;
  
  public FilePageRenderer(File file, PageFormat pageFormat)
      throws IOException {
    mFontSize = 12;
    mFont = new Font("Serif", Font.PLAIN, mFontSize);
    // Open the file.
    BufferedReader in = new BufferedReader(
        new FileReader(file));
    // Read all the lines.
    String line;
    mLines = new Vector();
    while ((line = in.readLine()) != null)
      mLines.addElement(line);
    // Clean up.
    in.close();
    // Now paginate, based on the PageFormat.
    paginate(pageFormat);
  }
  
  public void paginate(PageFormat pageFormat) {
    mCurrentPage = 0;
    mPages = new Vector();
    float y = mFontSize;
    Vector page = new Vector();
    for (int i = 0; i < mLines.size(); i++) {
      String line = (String)mLines.elementAt(i);
      page.addElement(line);
      y += mFontSize;
      if (y + mFontSize * 2 > pageFormat.getImageableHeight()) {
        y = 0;
        mPages.addElement(page);
        page = new Vector();
      }
    }
    // Add the last page.
    if (page.size() > 0) mPages.addElement(page);
    // Set our preferred size based on the PageFormat.
    mPreferredSize = new Dimension((int)pageFormat.getImageableWidth(),
        (int)pageFormat.getImageableHeight());
    repaint();
  }
  
  public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    // Make the background white.
    java.awt.geom.Rectangle2D r = new java.awt.geom.Rectangle2D.Float(0, 0,
        mPreferredSize.width, mPreferredSize.height);
    g2.setPaint(Color.white);
    g2.fill(r);
    // Get the current page.
    Vector page = (Vector)mPages.elementAt(mCurrentPage);
    // Draw all the lines for this page.
    g2.setFont(mFont);
    g2.setPaint(Color.black);
    float x = 0;
    float y = mFontSize;
    for (int i = 0; i < page.size(); i++) {
      String line = (String)page.elementAt(i);
      if (line.length() > 0) g2.drawString(line, (int)x, (int)y);
      y += mFontSize;
    }
  }
  
  public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
    if (pageIndex >= mPages.size()) return NO_SUCH_PAGE;
    int savedPage = mCurrentPage;
    mCurrentPage = pageIndex;
    Graphics2D g2 = (Graphics2D)g;
    g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
    paint(g2);
    mCurrentPage = savedPage;
    return PAGE_EXISTS;
  }
  
  public Dimension getPreferredSize() { return mPreferredSize; }
  
  public int getCurrentPage() { return mCurrentPage; }
  public int getNumPages() { return mPages.size(); }
  
  public void nextPage() {
    if (mCurrentPage < mPages.size() - 1)
      mCurrentPage++;
    repaint();
  }
  
  public void previousPage() {
    if (mCurrentPage > 0)
      mCurrentPage--;
    repaint();
  }
}