Skip to main content



      Home
Home » Eclipse Projects » GEF » PrintBigFigureOperation
PrintBigFigureOperation [message #53366] Fri, 10 January 2003 09:16 Go to next message
Eclipse UserFriend
Originally posted by: sven.e-sven.net

Already posted it in another thread. I'd like to get some feedback on
it. I think the translating of the figure and it's childs is not the
best way to do this, but it works.

Sven\ 8)

PS: The Question Window in the run method doesn't belong there. Is there
a way to display the number of pages in the PrintDialog?

------------------
import java.util.List;

import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.PrintFigureOperation;
import org.eclipse.draw2d.PrinterGraphics;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.printing.Printer;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;

/**
* Druckt eine IFigure über mehrere Seiten.
* @author Sven Müller
*/
public class PrintBigFigureOperation extends PrintFigureOperation {

private double scale;

public PrintBigFigureOperation(Printer printer, IFigure figure) {
super(printer, figure);
scale = getPrinter().getDPI().x / Display.getDefault().getDPI().x;
}

/**
* @see org.eclipse.draw2d.PrintOperation#printPages()
*/
protected void printPages() {
IFigure figure = getPrintSource();
boolean nextPage = true;
Point offset = figure.getBounds().getLocation().getCopy();
int x =
(int) (figure.getBounds().getSize().width
/ (getPrintRegion().width / scale));
int y =
(int) (figure.getBounds().getSize().height
/ (getPrintRegion().height / scale));
int memX1 = x;
int memX2 = offset.x;
PrinterGraphics g = getFreshPrinterGraphics();
List childs = figure.getChildren();
while (nextPage) {
g.pushState();
getPrinter().startPage();
g.setForegroundColor(figure.getForegroundColor());
g.setBackgroundColor(figure.getBackgroundColor());
g.setFont(figure.getFont());
g.scale(scale);
figure.translate(offset.x, offset.y);
for (int i = 0; i < childs.size(); i++)
((IFigure) childs.get(i)).translate(-offset.x, -offset.y);
g.translate(figure.getBounds().getLocation().getCopy().negat e());
g.clipRect(figure.getBounds());
figure.paint(g);
getPrinter().endPage();
g.restoreState();
if (x > 0) {
x--;
offset.x = (int) (getPrintRegion().width / scale);
} else if (y > 0) {
y--;
x = memX1;
figure.translate(-x * offset.x, 0);
for (int i = 0; i < childs.size(); i++)
((IFigure) childs.get(i)).translate(x * offset.x, 0);
offset.x = memX2;
offset.y = (int) (getPrintRegion().height / scale);
} else {
nextPage = false;
}
}
}
/**
* @see org.eclipse.draw2d.PrintOperation#run(String)
*/
public void run(String jobName) {
if (MessageDialog
.openQuestion(
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShel l(),
"Question...",
"Really print "
+ getNumofPages()
+ " pages on "
+ getPrinter().getPrinterData().name
+ "?"))
super.run(jobName);
}

private int getNumofPages() {
double x =
getPrintSource().getBounds().getSize().width
/ (getPrintRegion().width / scale);
double y =
getPrintSource().getBounds().getSize().height
/ (getPrintRegion().height / scale);
return (int)
(((x > (int) x) ? (int) x + 1 : (int) x)
* ((y > (int) y) ? (int) y + 1 : (int) y));
}
}
Re: PrintBigFigureOperation [message #53473 is a reply to message #53366] Fri, 10 January 2003 10:13 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: noone.ibm.com

Thank you Sven, this is looking good.

> I think the translating of the figure and it's childs is not the
> best way to do this, but it works.

Is it necessary to translate the figure at all? I think Randy's strategy
that he explained yesterday may be the best way to go. Idenitfy how many
pages will need to be printed, identify where these pages "start", and
translate the PrinterGraphics object to these points.
Re: PrintBigFigureOperation [message #53499 is a reply to message #53473] Fri, 10 January 2003 11:11 Go to previous message
Eclipse UserFriend
Originally posted by: sven.e-sven.net

You are right it's easier and faster to simply translate the PG.

Why move the world beneath your feet if walking is so easy? ;)

Sven\ 8)


Here's a better impl.:
------------
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.PrintFigureOperation;
import org.eclipse.draw2d.PrinterGraphics;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.printing.Printer;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;

/**
* Druckt eine IFigure über mehrere Seiten.
* @author Sven Müller
*/
public class PrintBigFigureOperation extends PrintFigureOperation {

private double scale;

public PrintBigFigureOperation(Printer printer, IFigure figure) {
super(printer, figure);
scale = getPrinter().getDPI().x / Display.getDefault().getDPI().x;
}

/**
* @see org.eclipse.draw2d.PrintOperation#printPages()
*/
protected void printPages() {
IFigure figure = getPrintSource();
boolean nextPage = true;
Point offset = figure.getBounds().getLocation();
int x =
(int) (getPrintSource().getBounds().getSize().width
/ (getPrintRegion().width / scale));
int y =
(int) (getPrintSource().getBounds().getSize().height
/ (getPrintRegion().height / scale));
PrinterGraphics g = getFreshPrinterGraphics();
g.setForegroundColor(figure.getForegroundColor());
g.setBackgroundColor(figure.getBackgroundColor());
g.setFont(figure.getFont());

for (int i = 0; i < getNumofPages(); i++) {
g.pushState();
getPrinter().startPage();
g.scale(scale);
g.translate(-offset.x, -offset.y);
g.clipRect(figure.getBounds());
figure.paint(g);
getPrinter().endPage();
g.restoreState();
if (x > 0) {
x--;
offset.x += (int) (getPrintRegion().width / scale);
} else if (y > 0) {
y--;
offset.y += (int) (getPrintRegion().height / scale);
offset.x = figure.getBounds().getLocation().x;
x =
(int) (getPrintSource().getBounds().getSize().width
/ (getPrintRegion().width / scale));
}
}
}
/**
* @see org.eclipse.draw2d.PrintOperation#run(String)
*/
public void run(String jobName) {
if (MessageDialog
.openQuestion(
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShel l(),
"Question...",
"Really print "
+ getNumofPages()
+ " pages on "
+ getPrinter().getPrinterData().name
+ "?"))
super.run(jobName);
}
/**
* Berechnet die Seiten die nötig sind um die {@link IFigure IFigure}
auf dem gewählten {@link Printer Printer} auszugeben
* @return int
*/
private int getNumofPages() {
double x =
getPrintSource().getBounds().getSize().width
/ (getPrintRegion().width / scale);
double y =
getPrintSource().getBounds().getSize().height
/ (getPrintRegion().height / scale);
return ((x > (int) x) ? (int) x + 1 : (int) x)
* ((y > (int) y) ? (int) y + 1 : (int) y);
}
}
Previous Topic:How can i support IPropertySource in GEF?
Next Topic:help me please
Goto Forum:
  


Current Time: Thu May 08 11:39:42 EDT 2025

Powered by FUDForum. Page generated in 0.03315 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top