1
14 package gate.print;
15
16 import java.awt.*;
17 import java.awt.print.*;
18
19 import javax.swing.JComponent;
20 import javax.swing.text.BadLocationException;
21 import javax.swing.text.JTextComponent;
22
23 import gate.event.StatusListener;
24 import gate.gui.MainFrame;
25 import gate.util.Err;
26
27
28
31 public class JComponentPrinter implements Pageable{
32
33 public JComponentPrinter(JComponent component, PageFormat format){
34 this.component = component;
35 this.pageFormat = format;
36 Rectangle componentBounds = component.getBounds(null);
38 scaleFactor = Math.min(format.getImageableWidth() /componentBounds.width,
39 1);
40
41 pageCount = (int)((componentBounds.height * scaleFactor +
43 pageFormat.getImageableHeight() - 1) /
44 pageFormat.getImageableHeight());
45 }
46
47
51 public int getNumberOfPages() {
52 return pageCount;
53 }
54
55
56
68 public PageFormat getPageFormat(int pageIndex)
69 throws IndexOutOfBoundsException {
70 if (pageIndex >= pageCount) throw new IndexOutOfBoundsException();
71 return pageFormat;
72 }
73
74
75
86 public Printable getPrintable(int pageIndex)
87 throws IndexOutOfBoundsException {
88 if (pageIndex >= pageCount)throw new IndexOutOfBoundsException();
89
90 double originY = pageIndex * pageFormat.getImageableHeight() / scaleFactor;
91 if(component instanceof JTextComponent){
92 JTextComponent tComp = (JTextComponent)component;
93 int location = tComp.viewToModel(new Point(0, (int)originY));
95 try{
96 Rectangle rect = tComp.modelToView(location);
97 originY = rect.y + rect.height - 1;
98 }catch(BadLocationException ble){
99 ble.printStackTrace(Err.getPrintWriter());
100 }
101 }
102
103 return new TranslatedPrintable(originY);
104 }
105
106
107
114 public class TranslatedPrintable implements Printable {
115 public TranslatedPrintable(double originY){
116 this.originY = originY;
117 }
118
119
143 public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
144 throws PrinterException {
145
146 Rectangle componentBounds = component.getBounds(null);
147 Graphics2D g2 = (Graphics2D) graphics;
148 g2.translate(pageFormat.getImageableX() - componentBounds.x,
149 pageFormat.getImageableY() - originY - componentBounds.y);
150 g2.scale(scaleFactor, scaleFactor);
151
152 if(component instanceof JTextComponent){
153 JTextComponent tComp = (JTextComponent)component;
154 double nextOriginY = (pageIndex + 1) * pageFormat.getImageableHeight() /
155 scaleFactor;
156 int location = tComp.viewToModel(new Point(0, (int)nextOriginY));
157 try{
158 Rectangle rect = tComp.modelToView(location);
159 nextOriginY = rect.y;
160 }catch(BadLocationException ble){
161 ble.printStackTrace(Err.getPrintWriter());
162 }
163 Rectangle clip = g2.getClip().getBounds();
164 clip.setSize((int)clip.getWidth(), (int)(nextOriginY - originY) - 1);
165 g2.setClip(clip);
166 }
167
168 boolean wasBuffered = component.isDoubleBuffered();
169 component.paint(g2);
170 component.setDoubleBuffered(wasBuffered);
171
172 StatusListener sListener = (StatusListener)MainFrame.getListeners().
174 get("gate.event.StatusListener");
175 if(sListener != null){
176 sListener.statusChanged("Printing page " + (pageIndex + 1) +
177 "/" + pageCount);
178 }
179
180 return PAGE_EXISTS;
181 }
182
183 double originY;
184 }
185
186
187 JComponent component;
188 PageFormat pageFormat;
189 int pageCount;
190 double scaleFactor;
191 }