package com.jpaulmorrison.graphics;
import java.awt.*;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.OrientationRequested;
import javax.swing.*;
import java.awt.print.*;
public class PrintableDocument implements Printable {
private Component compent;
Rectangle rect;
DrawFBP driver;
public PrintableDocument(Component compent, DrawFBP drawFBP) {
this.compent = compent;
driver = drawFBP;
}
public void setRectangle(Rectangle rect) {
this.rect = rect;
}
public void print() {
PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintable(this);
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(MediaSizeName.ISO_A4);
aset.add(OrientationRequested.LANDSCAPE);
if (printJob.printDialog(aset))
try {
printJob.print(aset);
} catch (Exception pe) {
System.out.println("Print Error: " + pe);
pe.printStackTrace();
}
}
// http://it.toolbox.com/wiki/index.php/How_to_print_in_Java
public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
if (pageIndex > 0) {
return (NO_SUCH_PAGE);
} else {
Graphics2D graph = (Graphics2D) g;
/*
double scale = driver.scalingFactor; // ???
System.out.println(rect.width + ", " + rect.height + "; " + pageFormat.getImageableWidth() + ", " + pageFormat.getImageableHeight());
if (rect.width > pageFormat.getImageableWidth()
|| rect.height > pageFormat.getImageableHeight()) {
// Calculate the scale factor to fit the window to the page.
double scaleX = pageFormat.getImageableWidth() / rect.width;
double scaleY = pageFormat.getImageableHeight() / rect.height;
scale = Math.min(scaleX, scaleY); // Get minimum scale factor
graph.scale(scale, scale);
}
*/
graph.scale(.67, .67); // FUDGE !!!
/*
graph.setClip((int) (pageFormat.getImageableX() / scale),
(int) (pageFormat.getImageableY() / scale),
(int) (pageFormat.getImageableWidth() / scale),
(int) (pageFormat.getImageableHeight() / scale));
*/
graph.translate(graph.getClipBounds().getX(), graph.getClipBounds()
.getY());
disableBuffering(compent);
compent.paint(graph);
enableBuffering(compent);
return (PAGE_EXISTS);
}
}
public static void disableBuffering(Component c) {
RepaintManager currentManager = RepaintManager.currentManager(c);
currentManager.setDoubleBufferingEnabled(false);
}
public static void enableBuffering(Component c) {
RepaintManager currentManager = RepaintManager.currentManager(c);
currentManager.setDoubleBufferingEnabled(true);
}
}