/******************************************************************************* * Copyright (c) 2005, 2012 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.ui.actions; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.SWTGraphics; import org.eclipse.gef.GraphicalViewer; import org.eclipse.gef.print.PrintGraphicalViewerOperation; import org.eclipse.gef.ui.actions.PrintAction; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.printing.PrintDialog; import org.eclipse.swt.printing.Printer; import org.eclipse.swt.printing.PrinterData; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IWorkbenchPart; public class BPELPrintAction extends PrintAction { protected class InternalPrintGraphicalViewerOperation extends PrintGraphicalViewerOperation { protected boolean needMultiPageX = false; protected boolean needMultiPageY = false; private long fPagesX = 1; private long fPagesY = 1; public InternalPrintGraphicalViewerOperation(Printer p, GraphicalViewer g) { super(p, g); } protected ImageData getNewImageData(Image image) { ImageData imageData = image.getImageData(); int x = imageData.width; int y = imageData.height; return imageData.scaledTo(x, y); } @Override protected void setupPrinterGraphicsFor(Graphics graphics, IFigure figure) { super.setupPrinterGraphicsFor(graphics, figure); double dpiScale = (double) getPrinter().getDPI().x / Display.getCurrent().getDPI().x; // put the print region in display coordinates org.eclipse.draw2d.geometry.Rectangle printableRegion = getPrintRegion(); printableRegion.width /= dpiScale; printableRegion.height /= dpiScale; org.eclipse.draw2d.geometry.Rectangle printRegion = figure.getBounds(); if (printRegion.width > printableRegion.width) { needMultiPageX = true; fPagesX = printRegion.width / printableRegion.width; if (printRegion.width % printableRegion.width != 0) fPagesX ++; } if (printRegion.height > printableRegion.height) { needMultiPageY = true; fPagesY = printRegion.height / printableRegion.height; if ((printRegion.height % printableRegion.height) != 0) fPagesY ++; } } @Override protected void printPages() { Graphics graphics = getFreshPrinterGraphics(); IFigure figure = getPrintSource(); setupPrinterGraphicsFor(graphics, figure); org.eclipse.draw2d.geometry.Rectangle region = figure.getBounds(); Image image = new Image(null, region.width, region.height); GC gc = new GC(image); SWTGraphics g = new SWTGraphics(gc); g.translate(region.x, region.y); figure.paint(g); double dpiScale = (double) getPrinter().getDPI().x / Display.getCurrent().getDPI().x; // put the print region in display coordinates region = getPrintRegion(); region.width /= dpiScale; region.height /= dpiScale; // print the graph ImageData imageData = getNewImageData(image); Image newImage = new Image(null, imageData); for (int j=0; j < fPagesY; j++) { for (int i=0; i < fPagesX; i++) { int x = region.width * i; int y = region.height * j; graphics.pushState(); getPrinter().startPage(); graphics.drawImage(newImage, x, y, imageData.width - x, imageData.height - y, 0, 0, imageData.width - x, imageData.height - y); getPrinter().endPage(); graphics.popState(); } } g.dispose(); gc.dispose(); image.dispose(); } } public BPELPrintAction(IWorkbenchPart part) { super(part); } @Override public void run() { GraphicalViewer viewer; viewer = (GraphicalViewer)getWorkbenchPart().getAdapter(GraphicalViewer.class); PrintDialog dialog = new PrintDialog(viewer.getControl().getShell(), SWT.NULL); PrinterData data = dialog.open(); if (data != null) { PrintGraphicalViewerOperation op = new InternalPrintGraphicalViewerOperation(new Printer(data), viewer); op.run(getWorkbenchPart().getTitle()); } } }