001    package org.mesopotamia.util;
002    
003    import java.awt.Component;
004    import java.awt.Graphics;
005    import java.awt.Graphics2D;
006    import java.awt.print.PageFormat;
007    import java.awt.print.Printable;
008    import java.awt.print.PrinterException;
009    import java.awt.print.PrinterJob;
010    
011    import javax.swing.RepaintManager;
012    
013    public class ComponentPrinter implements Printable {
014            private Component componentToBePrinted;
015    
016            public static void printComponent(Component c) {
017                    new ComponentPrinter(c).print();
018            }
019    
020            public ComponentPrinter(Component componentToBePrinted) {
021                    this.componentToBePrinted = componentToBePrinted;
022            }
023    
024            public void print() {
025                    PrinterJob printJob = PrinterJob.getPrinterJob();
026                    printJob.setPrintable(this);
027                    if (printJob.printDialog())
028                            try {
029                                    printJob.print();
030                            } catch (PrinterException pe) {
031                                    System.out.println("Error printing: " + pe);
032                            }
033            }
034    
035            public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
036                    if (pageIndex > 0) {
037                            return (NO_SUCH_PAGE);
038                    }
039                    
040                    Graphics2D g2d = (Graphics2D) g;
041                    g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
042                    disableDoubleBuffering(componentToBePrinted);
043                    componentToBePrinted.paint(g2d);
044                    enableDoubleBuffering(componentToBePrinted);
045                    return (PAGE_EXISTS);
046            }
047    
048            public static void disableDoubleBuffering(Component c) {
049                    RepaintManager currentManager = RepaintManager.currentManager(c);
050                    currentManager.setDoubleBufferingEnabled(false);
051            }
052    
053            public static void enableDoubleBuffering(Component c) {
054                    RepaintManager currentManager = RepaintManager.currentManager(c);
055                    currentManager.setDoubleBufferingEnabled(true);
056            }
057    }