blob: 55d58fbcc2f3bbb7a6ae6ebe937ce4a067ddb359 [file] [log] [blame]
/*******************************************************************************
* 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());
}
}
}