28
|
1 /*******************************************************************************
|
|
2 * Copyright (c) 2000, 2004 IBM Corporation and others.
|
|
3 * All rights reserved. This program and the accompanying materials
|
|
4 * are made available under the terms of the Eclipse Public License v1.0
|
|
5 * which accompanies this distribution, and is available at
|
|
6 * http://www.eclipse.org/legal/epl-v10.html
|
|
7 *
|
|
8 * Contributors:
|
|
9 * IBM Corporation - initial API and implementation
|
|
10 * D Port:
|
|
11 * Adam Chrapkowski <adam DOT chrapkowski AT gmail DOT com>
|
|
12 *******************************************************************************/
|
|
13 module org.eclipse.swt.snippets.Snippet133;
|
|
14
|
|
15 /*
|
|
16 * Printing example snippet: print text to printer, with word wrap and pagination
|
|
17 *
|
|
18 * For a list of all SWT example snippets see
|
|
19 * http://www.eclipse.org/swt/snippets/
|
|
20 */
|
|
21
|
|
22 // org.eclipse.swt
|
|
23 import org.eclipse.swt.SWT;
|
|
24 // org.eclipse.swt.graphics
|
|
25 import org.eclipse.swt.graphics.Color,
|
|
26 org.eclipse.swt.graphics.Font,
|
|
27 org.eclipse.swt.graphics.FontData,
|
|
28 org.eclipse.swt.graphics.GC,
|
|
29 org.eclipse.swt.graphics.Rectangle,
|
|
30 org.eclipse.swt.graphics.RGB;
|
|
31 // org.eclipse.swt.widgets
|
|
32 import org.eclipse.swt.widgets.Display,
|
|
33 org.eclipse.swt.widgets.ColorDialog,
|
|
34 org.eclipse.swt.widgets.FileDialog,
|
|
35 org.eclipse.swt.widgets.FontDialog,
|
|
36 org.eclipse.swt.widgets.Menu,
|
|
37 org.eclipse.swt.widgets.MenuItem,
|
|
38 org.eclipse.swt.widgets.MessageBox,
|
|
39 org.eclipse.swt.widgets.Shell,
|
|
40 org.eclipse.swt.widgets.Text;
|
|
41 // org.eclipse.swt.events
|
|
42 import org.eclipse.swt.events.SelectionAdapter,
|
|
43 org.eclipse.swt.events.SelectionEvent;
|
|
44 // org.eclipse.swt.layout
|
|
45 import org.eclipse.swt.layout.FillLayout;
|
|
46 // org.eclipse.swt.printing
|
|
47 import org.eclipse.swt.printing.PrintDialog,
|
|
48 org.eclipse.swt.printing.Printer,
|
|
49 org.eclipse.swt.printing.PrinterData;
|
|
50 // java
|
|
51 import java.lang.all;
|
|
52
|
|
53 // tango
|
|
54 import tango.core.Thread;
|
|
55 import tango.io.File;
|
|
56 import tango.text.Unicode;
|
|
57
|
|
58 public void
|
|
59 main(String[] args){
|
|
60 (new Snippet133).open();
|
|
61 }
|
|
62
|
|
63 class Snippet133{
|
|
64 Display display;
|
|
65 Shell shell;
|
|
66 Text text;
|
|
67 Font font;
|
|
68 Color foregroundColor, backgroundColor;
|
|
69
|
|
70 Printer printer;
|
|
71 GC gc;
|
|
72 FontData[] printerFontData;
|
|
73 RGB printerForeground, printerBackground;
|
|
74
|
|
75 int lineHeight = 0;
|
|
76 int tabWidth = 0;
|
|
77 int leftMargin, rightMargin, topMargin, bottomMargin;
|
|
78 int x, y;
|
|
79 int index, end;
|
|
80 String textToPrint;
|
|
81 String tabs;
|
|
82 StringBuffer wordBuffer;
|
|
83
|
|
84 public void
|
|
85 open(){
|
|
86 display = new Display();
|
|
87 shell = new Shell(display);
|
|
88 shell.setLayout(new FillLayout());
|
|
89 shell.setText("Print Text");
|
|
90 text = new Text(shell, SWT.BORDER | DWT.MULTI | DWT.V_SCROLL | DWT.H_SCROLL);
|
|
91
|
|
92 Menu menuBar = new Menu(shell, SWT.BAR);
|
|
93 shell.setMenuBar(menuBar);
|
|
94 MenuItem item = new MenuItem(menuBar, SWT.CASCADE);
|
|
95 item.setText("&File");
|
|
96 Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
|
|
97 item.setMenu(fileMenu);
|
|
98 item = new MenuItem(fileMenu, SWT.PUSH);
|
|
99 item.setText("&Open...");
|
|
100 item.setAccelerator(SWT.CTRL + 'O');
|
|
101 item.addSelectionListener(new class() SelectionAdapter{
|
|
102 public void
|
|
103 widgetSelected(SelectionEvent event) {
|
|
104 menuOpen();
|
|
105 }
|
|
106 });
|
|
107 item = new MenuItem(fileMenu, SWT.PUSH);
|
|
108 item.setText("Font...");
|
|
109 item.addSelectionListener(new class() SelectionAdapter{
|
|
110 public void
|
|
111 widgetSelected(SelectionEvent event){
|
|
112 menuFont();
|
|
113 }
|
|
114 });
|
|
115 item = new MenuItem(fileMenu, SWT.PUSH);
|
|
116 item.setText("Foreground Color...");
|
|
117 item.addSelectionListener(new class() SelectionAdapter{
|
|
118 public void
|
|
119 widgetSelected(SelectionEvent event){
|
|
120 menuForegroundColor();
|
|
121 }
|
|
122 });
|
|
123 item = new MenuItem(fileMenu, SWT.PUSH);
|
|
124 item.setText("Background Color...");
|
|
125 item.addSelectionListener(new class() SelectionAdapter{
|
|
126 public void
|
|
127 widgetSelected(SelectionEvent event) {
|
|
128 menuBackgroundColor();
|
|
129 }
|
|
130 });
|
|
131 item = new MenuItem(fileMenu, SWT.PUSH);
|
|
132 item.setText("&Print...");
|
|
133 item.setAccelerator(SWT.CTRL + 'P');
|
|
134 item.addSelectionListener(new class() SelectionAdapter{
|
|
135 public void
|
|
136 widgetSelected(SelectionEvent event) {
|
|
137 menuPrint();
|
|
138 }
|
|
139 });
|
|
140 new MenuItem(fileMenu, SWT.SEPARATOR);
|
|
141 item = new MenuItem(fileMenu, SWT.PUSH);
|
|
142 item.setText("E&xit");
|
|
143 item.addSelectionListener(new class() SelectionAdapter{
|
|
144 public void
|
|
145 widgetSelected(SelectionEvent event){
|
|
146 System.exit(0);
|
|
147 }
|
|
148 });
|
|
149
|
|
150 shell.open();
|
|
151 while (!shell.isDisposed()) {
|
|
152 if (!display.readAndDispatch()) display.sleep();
|
|
153 }
|
|
154 if (font !is null) font.dispose();
|
|
155 if (foregroundColor !is null) foregroundColor.dispose();
|
|
156 if (backgroundColor !is null) backgroundColor.dispose();
|
|
157 display.dispose();
|
|
158 }
|
|
159
|
|
160 private void
|
|
161 menuOpen(){
|
|
162 String textString;
|
|
163 FileDialog dialog = new FileDialog(shell, SWT.OPEN);
|
|
164 dialog.setFilterExtensions(["*.java", "*.*"]);
|
|
165 String name = dialog.open();
|
|
166 if(name is null) return;
|
|
167
|
|
168 try{
|
|
169 scope File file = new File(name);
|
|
170 try{
|
|
171 textString = cast(char[])file.read;
|
|
172 }
|
|
173 catch (IOException e){
|
|
174 MessageBox box = new MessageBox(shell, SWT.ICON_ERROR);
|
|
175 box.setMessage("Error reading file:\n" ~ name);
|
|
176 box.open();
|
|
177 return;
|
|
178 }
|
|
179 }
|
|
180 catch(Exception e){
|
|
181 MessageBox box = new MessageBox(shell, SWT.ICON_ERROR);
|
|
182 box.setMessage("File not found:\n" ~ name);
|
|
183 box.open();
|
|
184 return;
|
|
185 }
|
|
186 text.setText(textString);
|
|
187 }
|
|
188
|
|
189 private void
|
|
190 menuFont(){
|
|
191 FontDialog fontDialog = new FontDialog(shell);
|
|
192 fontDialog.setFontList(text.getFont().getFontData());
|
|
193 FontData fontData = fontDialog.open();
|
|
194 if(fontData !is null){
|
|
195 if(font !is null) font.dispose();
|
|
196 font = new Font(display, fontData);
|
|
197 text.setFont(font);
|
|
198 }
|
|
199 }
|
|
200
|
|
201 private void
|
|
202 menuForegroundColor(){
|
|
203 ColorDialog colorDialog = new ColorDialog(shell);
|
|
204 colorDialog.setRGB(text.getForeground().getRGB());
|
|
205 RGB rgb = colorDialog.open();
|
|
206 if(rgb !is null){
|
|
207 if(foregroundColor !is null) foregroundColor.dispose();
|
|
208 foregroundColor = new Color(display, rgb);
|
|
209 text.setForeground(foregroundColor);
|
|
210 }
|
|
211 }
|
|
212
|
|
213 private void
|
|
214 menuBackgroundColor(){
|
|
215 ColorDialog colorDialog = new ColorDialog(shell);
|
|
216 colorDialog.setRGB(text.getBackground().getRGB());
|
|
217 RGB rgb = colorDialog.open();
|
|
218 if(rgb !is null){
|
|
219 if(backgroundColor !is null) backgroundColor.dispose();
|
|
220 backgroundColor = new Color(display, rgb);
|
|
221 text.setBackground(backgroundColor);
|
|
222 }
|
|
223 }
|
|
224
|
|
225 private void
|
|
226 menuPrint(){
|
|
227 PrintDialog dialog = new PrintDialog(shell, SWT.NONE);
|
|
228 PrinterData data = dialog.open();
|
|
229 if(data is null) return;
|
|
230 if(data.printToFile){
|
|
231 data.fileName = "print.out"; // you probably want to ask the user for a filename
|
|
232 }
|
|
233
|
|
234 /* Get the text to print from the Text widget (you could get it from anywhere, i.e. your java model) */
|
|
235 textToPrint = text.getText();
|
|
236
|
|
237 /* Get the font & foreground & background data. */
|
|
238 printerFontData = text.getFont().getFontData();
|
|
239 printerForeground = text.getForeground().getRGB();
|
|
240 printerBackground = text.getBackground().getRGB();
|
|
241
|
|
242 /* Do the printing in a background thread so that spooling does not freeze the UI. */
|
|
243 printer = new Printer(data);
|
|
244 Thread printingThread = new class ("Printing") Thread{
|
|
245 private void
|
|
246 run(){
|
|
247 print(printer);
|
|
248 printer.dispose();
|
|
249 }
|
|
250 public
|
|
251 this(char[] o_name){
|
|
252 this.name = o_name;
|
|
253 super(&run);
|
|
254 }
|
|
255 };
|
|
256 printingThread.start();
|
|
257 }
|
|
258
|
|
259 private void
|
|
260 print(Printer printer){
|
|
261 if(printer.startJob("Text")){ // the string is the job name - shows up in the printer's job list
|
|
262 Rectangle clientArea = printer.getClientArea();
|
|
263 Rectangle trim = printer.computeTrim(0, 0, 0, 0);
|
|
264 Point dpi = printer.getDPI();
|
|
265 leftMargin = dpi.x + trim.x; // one inch from left side of paper
|
|
266 rightMargin = clientArea.width - dpi.x + trim.x + trim.width; // one inch from right side of paper
|
|
267 topMargin = dpi.y + trim.y; // one inch from top edge of paper
|
|
268 bottomMargin = clientArea.height - dpi.y + trim.y + trim.height; // one inch from bottom edge of paper
|
|
269
|
|
270 /* Create a buffer for computing tab width. */
|
|
271 int tabSize = 4; // is tab width a user setting in your UI?
|
|
272 StringBuffer tabBuffer = new StringBuffer(tabSize);
|
|
273 for (int i = 0; i < tabSize; i++) tabBuffer.append(' ');
|
|
274 tabs = tabBuffer.toString();
|
|
275
|
|
276 /* Create printer GC, and create and set the printer font & foreground color. */
|
|
277 gc = new GC(printer);
|
|
278 Font printerFont = new Font(printer, printerFontData);
|
|
279 Color printerForegroundColor = new Color(printer, printerForeground);
|
|
280 Color printerBackgroundColor = new Color(printer, printerBackground);
|
|
281
|
|
282 gc.setFont(printerFont);
|
|
283 gc.setForeground(printerForegroundColor);
|
|
284 gc.setBackground(printerBackgroundColor);
|
|
285 tabWidth = gc.stringExtent(tabs).x;
|
|
286 lineHeight = gc.getFontMetrics().getHeight();
|
|
287
|
|
288 /* Print text to current gc using word wrap */
|
|
289 printText();
|
|
290 printer.endJob();
|
|
291
|
|
292 /* Cleanup graphics resources used in printing */
|
|
293 printerFont.dispose();
|
|
294 printerForegroundColor.dispose();
|
|
295 printerBackgroundColor.dispose();
|
|
296 gc.dispose();
|
|
297 }
|
|
298 }
|
|
299
|
|
300 private void
|
|
301 printText(){
|
|
302 printer.startPage();
|
|
303 wordBuffer = new StringBuffer();
|
|
304 x = leftMargin;
|
|
305 y = topMargin;
|
|
306 index = 0;
|
|
307 end = textToPrint.length;
|
|
308 while(index < end){
|
|
309 char c = textToPrint.charAt(index);
|
|
310 index++;
|
|
311 if(c != 0){
|
|
312 if(c == 0x0a || c == 0x0d){
|
|
313 if(c == 0x0d && index < end && textToPrint.charAt(index) == 0x0a){
|
|
314 index++; // if this is cr-lf, skip the lf
|
|
315 }
|
|
316 printWordBuffer();
|
|
317 newline();
|
|
318 }
|
|
319 else{
|
|
320 if(c != '\t'){
|
|
321 wordBuffer.append(c);
|
|
322 }
|
|
323 if(isPrintable(c)){
|
|
324 printWordBuffer();
|
|
325 if (c == '\t'){
|
|
326 x += tabWidth;
|
|
327 }
|
|
328 }
|
|
329 }
|
|
330 }
|
|
331 }
|
|
332 if (y + lineHeight <= bottomMargin) {
|
|
333 printer.endPage();
|
|
334 }
|
|
335 }
|
|
336
|
|
337 private void
|
|
338 printWordBuffer(){
|
|
339 if(wordBuffer.length > 0){
|
|
340 String word = wordBuffer.toString();
|
|
341 int wordWidth = gc.stringExtent(word).x;
|
|
342 if(x + wordWidth > rightMargin){
|
|
343 /* word doesn't fit on current line, so wrap */
|
|
344 newline();
|
|
345 }
|
|
346 gc.drawString(word, x, y, false);
|
|
347 x += wordWidth;
|
|
348 wordBuffer = new StringBuffer();
|
|
349 }
|
|
350 }
|
|
351
|
|
352 private void
|
|
353 newline(){
|
|
354 x = leftMargin;
|
|
355 y += lineHeight;
|
|
356 if(y + lineHeight > bottomMargin){
|
|
357 printer.endPage();
|
|
358 if(index + 1 < end){
|
|
359 y = topMargin;
|
|
360 printer.startPage();
|
|
361 }
|
|
362 }
|
|
363 }
|
|
364 }
|
|
365
|