package ie.dcu.apps.ist.actions; import ie.dcu.apps.ist.views.SegmentationView; import ie.dcu.segment.SegmentationContext; import ie.dcu.segment.painters.SegmentationPainter; import ie.dcu.swt.ObservableImage; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.*; import org.eclipse.swt.printing.*; import org.eclipse.swt.widgets.Display; /** * Send current view to printer. * * @author Kevin McGuinness */ public class PrintAction extends AppAction { private static final String JOB_NAME = "Interactive Segmentation Tool"; private PrintDialog dialog; public PrintAction(ActionManager m) { super(m); } @Override public void run() { if (window.hasContext()) { status("Printing..."); PrinterData data = getPrintData(); if (data != null) { print(data); status("Printing complete"); } else { status(null); } } } private PrinterData getPrintData() { createPrintDialog(); return dialog.open(); } private void print(PrinterData data) { Printer printer = new Printer(data); try { print(printer); } finally { printer.dispose(); } } private void print(Printer printer) { if (printer.startJob(JOB_NAME)) { if (printer.startPage()) { GC gc = new GC(printer); try { paint(gc, printer); } finally { gc.dispose(); } printer.endPage(); } printer.endJob(); } } private void paint(GC gc, Printer printer) { Image im = paintContext(); try { gc.drawImage(im, 30, 30); } finally { im.dispose(); } } private void createPrintDialog() { if (dialog == null) { dialog = new PrintDialog(window.getShell(), SWT.SHEET); } } private Image paintContext() { SegmentationView view = window.getView(); SegmentationContext ctx = window.getContext(); SegmentationPainter painter = view.getPainter(); ObservableImage im = createCompatibleImage(ctx); painter.paint(ctx, im); return im.getImage(); } private ObservableImage createCompatibleImage(SegmentationContext ctx) { Image im = new Image(Display.getCurrent(), ctx.getBounds()); return new ObservableImage(im); } }