package com.horstmann.violet.framework;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.ResourceBundle;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
/**
* The component for displaying the print preview.
*/
class PrintPreviewCanvas extends JComponent
{
private PrintDialog pd;
PrintPreviewCanvas(PrintDialog pd_) {
pd = pd_;
}
public Dimension getPreferredSize()
{
return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
}
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
pd.bounds = pd.graph.getBounds(g2);
double xoff; // x offset of page start in window
double yoff; // y offset of page start in window
double scalePagesToCanvas; // scale factor to fit pages in canvas
double px = pd.pageFormat.getImageableWidth();
double py = pd.pageFormat.getImageableHeight();
int cols = pd.getCols();
int rows = pd.getRows();
double dx = px * pd.getCols();
double dy = py * pd.getRows();
double sx = pd.getWidth() - 1;
double sy = pd.getHeight() - 1;
if (dx / dy < sx / sy) // center horizontally
{
scalePagesToCanvas = sy / dy;
xoff = 0.5 * (sx - scalePagesToCanvas * dx);
yoff = 0;
}
else
// center vertically
{
scalePagesToCanvas = sx / dx;
xoff = 0;
yoff = 0.5 * (sy - scalePagesToCanvas * dy);
}
g2.translate((float) xoff, (float) yoff);
g2.scale((float) scalePagesToCanvas, (float) scalePagesToCanvas);
// draw page backgrounds
Rectangle2D pages = new Rectangle2D.Double(0, 0, px * cols, py * rows);
g2.setPaint(Color.WHITE);
g2.fill(pages);
g2.setPaint(Color.BLACK);
AffineTransform oldTransform = g2.getTransform();
g2.scale((float) pd.scaleGraph, (float) pd.scaleGraph);
g2.translate((float) -pd.bounds.getX(), (float) -pd.bounds.getY());
pd.graph.draw(g2, null);
g2.setTransform(oldTransform);
// draw page outlines (ignoring margins)
g2.setPaint(getBackground());
for (int i = 0; i < cols; i++)
for (int j = 0; j < rows; j++)
{
Rectangle2D page = new Rectangle2D.Double(i * px, j * py, px, py);
g2.draw(page);
}
}
private static final int DEFAULT_WIDTH = 450;
private static final int DEFAULT_HEIGHT = 300;
}