1 package com.github.davidmoten.xuml;
2
3 import java.awt.Graphics;
4 import java.awt.Graphics2D;
5 import java.awt.image.BufferedImage;
6 import java.awt.print.PageFormat;
7 import java.awt.print.Printable;
8 import java.awt.print.PrinterException;
9 import java.awt.print.PrinterJob;
10 import java.io.File;
11 import java.io.FileNotFoundException;
12 import java.io.FileOutputStream;
13 import java.io.IOException;
14 import java.io.OutputStream;
15
16 import javax.imageio.ImageIO;
17 import javax.swing.JPanel;
18
19 public final class Panels {
20
21 public static void saveImage(JPanel panel, File file) {
22 try (FileOutputStream fos = new FileOutputStream(file)) {
23 saveImage(panel, fos);
24 } catch (FileNotFoundException e) {
25 throw new RuntimeException(e);
26 } catch (IOException e) {
27 throw new RuntimeException(e);
28 }
29 }
30
31 public static void saveImage(JPanel panel, OutputStream os) {
32 BufferedImage bi = new BufferedImage(panel.getPreferredSize().width,
33 panel.getPreferredSize().height, BufferedImage.TYPE_INT_RGB);
34 Graphics2D g2 = bi.createGraphics();
35 panel.setDoubleBuffered(false);
36 panel.paint(g2);
37 panel.setDoubleBuffered(true);
38 g2.dispose();
39 try {
40 ImageIO.write(bi, "png", os);
41 } catch (IOException e) {
42 throw new RuntimeException(e);
43 }
44 }
45
46 public static void print(final JPanel panel) throws PrinterException {
47 PrinterJob pj = PrinterJob.getPrinterJob();
48 pj.setJobName("State Diagram");
49 pj.setCopies(1);
50 PageFormat format = pj.defaultPage();
51 if (panel.getPreferredSize().getWidth() > panel.getPreferredSize().getHeight())
52 format.setOrientation(PageFormat.LANDSCAPE);
53 else
54 format.setOrientation(PageFormat.PORTRAIT);
55
56 pj.setPrintable(new Printable() {
57 @Override
58 public int print(Graphics pg, PageFormat pf, int pageNum) {
59 if (pageNum > 0)
60 return Printable.NO_SUCH_PAGE;
61 Graphics2D g2 = (Graphics2D) pg;
62 double w;
63 double h;
64 if (pf.getOrientation() == PageFormat.LANDSCAPE) {
65 w = pf.getPaper().getImageableHeight();
66 h = pf.getPaper().getImageableWidth();
67 } else {
68 w = pf.getPaper().getImageableWidth();
69 h = pf.getPaper().getImageableHeight();
70 }
71 double scalex = w / panel.getPreferredSize().getWidth();
72 double scaley = h / panel.getPreferredSize().getHeight();
73 double scale = Math.min(scalex, scaley);
74
75 g2.translate(pf.getImageableX(), pf.getImageableY());
76 g2.scale(scale, scale);
77 panel.setDoubleBuffered(false);
78 panel.paint(g2);
79 panel.setDoubleBuffered(true);
80 return Printable.PAGE_EXISTS;
81 }
82 });
83 if (pj.printDialog() == false)
84 return;
85 pj.print();
86 }
87
88 }