diff --git a/uk/ac/sanger/artemis/components/PrintACT.java b/uk/ac/sanger/artemis/components/PrintACT.java index 0feba1496b83ce6d794394b3277dc57f2629bb2b..bbf33ec5b382c4d8af33d8a46ab2ff42499cbea8 100644 --- a/uk/ac/sanger/artemis/components/PrintACT.java +++ b/uk/ac/sanger/artemis/components/PrintACT.java @@ -22,18 +22,33 @@ package uk.ac.sanger.artemis.components; import java.awt.*; -import java.awt.print.Paper; -import java.awt.print.PageFormat; -import java.awt.print.PrinterJob; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; -import java.awt.event.*; -import javax.swing.*; -import java.util.*; -import java.io.*; -import javax.swing.border.*; -import javax.imageio.*; -import javax.imageio.stream.*; +import java.awt.print.PageFormat; +import java.awt.print.Printable; +import java.awt.print.PrinterException; +import java.awt.print.PrinterJob; +import java.io.File; +import java.io.IOException; + +import javax.swing.Box; +import javax.swing.JCheckBox; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JComboBox; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JSeparator; +import javax.swing.KeyStroke; import uk.ac.sanger.artemis.editor.ScrollPanel; @@ -42,9 +57,9 @@ import uk.ac.sanger.artemis.editor.ScrollPanel; * Use to print images from ACT * */ -public class PrintACT extends ScrollPanel +public class PrintACT extends ScrollPanel implements Printable { - + private static final long serialVersionUID = 1L; /** act display to create image from */ private MultiComparator mc; private JCheckBox drawLabels = new JCheckBox("Show labels on alignment"); @@ -173,7 +188,7 @@ public class PrintACT extends ScrollPanel menuBar.add(filemenu); // print png/jpeg - JMenuItem printImage = new JMenuItem("Print Image Files (png/jpeg)..."); + JMenuItem printImage = new JMenuItem("Save As Image Files (png/jpeg)..."); printImage.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) @@ -182,6 +197,17 @@ public class PrintACT extends ScrollPanel } }); filemenu.add(printImage); + +// print PostScript + JMenuItem printPS = new JMenuItem("Print..."); + printPS.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + doPrintActions(); + } + }); + filemenu.add(printPS); // close filemenu.add(new JSeparator()); @@ -298,6 +324,25 @@ public class PrintACT extends ScrollPanel * */ private RenderedImage createImage() + { + Dimension d = getImageSize(); + + // Create a buffered image in which to draw + BufferedImage bufferedImage = new BufferedImage( + d.width,d.height, + BufferedImage.TYPE_INT_RGB); + // Create a graphics contents on the buffered image + Graphics2D g2d = bufferedImage.createGraphics(); + paintComponent(g2d); + + return bufferedImage; + } + + /** + * Get the size of the image + * @return + */ + private Dimension getImageSize() { int width = 999999; int height = 0; @@ -342,19 +387,9 @@ public class PrintACT extends ScrollPanel width = mc.getAlignmentViewerArray()[i].getWidth(); } } - - // Create a buffered image in which to draw - BufferedImage bufferedImage = new BufferedImage( - width,height, - BufferedImage.TYPE_INT_RGB); - // Create a graphics contents on the buffered image - Graphics2D g2d = bufferedImage.createGraphics(); - paintComponent(g2d); - - return bufferedImage; + return new Dimension(width, height); } - - + /** * * Write out the image @@ -376,5 +411,50 @@ public class PrintACT extends ScrollPanel e.printStackTrace(); } } + + protected void doPrintActions() + { + final PrinterJob pj=PrinterJob.getPrinterJob(); + pj.setPrintable(PrintACT.this); + pj.printDialog(); + try + { + pj.print(); + } + catch (Exception PrintException) {} + } + + /** + * + * The method @print@ must be implemented for @Printable@ interface. + * Parameters are supplied by system. + * + */ + public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException + { + Graphics2D g2 = (Graphics2D) g; + +// RepaintManager.currentManager(this).setDoubleBufferingEnabled(false); + Dimension d = getImageSize(); //get size of document + double panelWidth = d.width; //width in pixels + double panelHeight = d.height; //height in pixels + + double pageHeight = pf.getImageableHeight(); //height of printer page + double pageWidth = pf.getImageableWidth(); //width of printer page + double scale = pageWidth/panelWidth; + int totalNumPages = (int)Math.ceil(scale * panelHeight / pageHeight); + // Make sure not print empty pages + if(pageIndex >= totalNumPages) + return Printable.NO_SUCH_PAGE; + + // Shift Graphic to line up with beginning of print-imageable region + g2.translate(pf.getImageableX(), pf.getImageableY()); + // Shift Graphic to line up with beginning of next page to print + g2.translate(0f, -pageIndex*pageHeight); + // Scale the page so the width fits... + g2.scale(scale, scale); + paintComponent(g2); + return Printable.PAGE_EXISTS; + } } diff --git a/uk/ac/sanger/artemis/components/PrintArtemis.java b/uk/ac/sanger/artemis/components/PrintArtemis.java index f599c68871fa5a7d181a80b06a76a9a5a4f0fdbd..566d7b5c07e00fead892f71143033a8b02480122 100644 --- a/uk/ac/sanger/artemis/components/PrintArtemis.java +++ b/uk/ac/sanger/artemis/components/PrintArtemis.java @@ -24,11 +24,13 @@ package uk.ac.sanger.artemis.components; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; +import java.awt.print.PageFormat; +import java.awt.print.Printable; +import java.awt.print.PrinterException; +import java.awt.print.PrinterJob; import java.awt.event.*; import javax.swing.*; import java.io.*; -import javax.imageio.*; -import javax.imageio.stream.*; import uk.ac.sanger.artemis.editor.ScrollPanel; @@ -37,8 +39,9 @@ import uk.ac.sanger.artemis.editor.ScrollPanel; * Use to print images from Artemis * */ -public class PrintArtemis extends ScrollPanel +public class PrintArtemis extends ScrollPanel implements Printable { + private static final long serialVersionUID = 1L; /** entry to create image from */ private EntryEdit entry; @@ -183,7 +186,7 @@ public class PrintArtemis extends ScrollPanel menuBar.add(filemenu); // print png/jpeg - JMenuItem printImage = new JMenuItem("Print Image Files (png/jpeg)..."); + JMenuItem printImage = new JMenuItem("Save As Image Files (png/jpeg)..."); printImage.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) @@ -192,6 +195,17 @@ public class PrintArtemis extends ScrollPanel } }); filemenu.add(printImage); + +// print PostScript + JMenuItem printPS = new JMenuItem("Print..."); + printPS.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + doPrintActions(); + } + }); + filemenu.add(printPS); // close filemenu.add(new JSeparator()); @@ -421,13 +435,23 @@ public class PrintArtemis extends ScrollPanel "This option requires Java 1.4 or higher."); } } - + + protected void doPrintActions() + { + final PrinterJob pj=PrinterJob.getPrinterJob(); + pj.setPrintable(PrintArtemis.this); + pj.printDialog(); + try + { + pj.print(); + } + catch (Exception PrintException) {} + } + /** - * * Returns a generated image * @param pageIndex page number * @return image - * */ private RenderedImage createImage() { @@ -445,12 +469,10 @@ public class PrintArtemis extends ScrollPanel /** - * * Write out the image * @param image image * @param file file to write image to * @param type type of image - * */ private void writeImageToFile(RenderedImage image, File file, String type) @@ -466,4 +488,43 @@ public class PrintArtemis extends ScrollPanel } } + /** + * + * The method @print@ must be implemented for @Printable@ interface. + * Parameters are supplied by system. + * + */ + public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException + { + setImageSize(); + Graphics2D g2 = (Graphics2D) g; + +// RepaintManager.currentManager(this).setDoubleBufferingEnabled(false); + Dimension d = this.getSize(); //get size of document + double panelWidth = d.width; //width in pixels + double panelHeight = d.height; //height in pixels + + if(panelWidth == 0) + { + d = this.getPreferredSize(); + panelWidth = d.width; + panelHeight = d.height; + } + double pageHeight = pf.getImageableHeight(); //height of printer page + double pageWidth = pf.getImageableWidth(); //width of printer page + double scale = pageWidth/panelWidth; + int totalNumPages = (int)Math.ceil(scale * panelHeight / pageHeight); + // Make sure not print empty pages + if(pageIndex >= totalNumPages) + return Printable.NO_SUCH_PAGE; + + // Shift Graphic to line up with beginning of print-imageable region + g2.translate(pf.getImageableX(), pf.getImageableY()); + // Shift Graphic to line up with beginning of next page to print + g2.translate(0f, -pageIndex*pageHeight); + // Scale the page so the width fits... + g2.scale(scale, scale); + paintComponent(g2); + return Printable.PAGE_EXISTS; + } }