1 package net.sourceforge.pmd.swingui;
2
3 import net.sourceforge.pmd.swingui.event.ListenerList;
4 import net.sourceforge.pmd.swingui.event.TextAnalysisResultsEvent;
5 import net.sourceforge.pmd.swingui.event.TextAnalysisResultsEventListener;
6
7 import java.awt.Dimension;
8 import java.awt.Font;
9 import java.awt.FontMetrics;
10 import java.awt.Graphics;
11 import java.awt.PrintJob;
12 import java.awt.Toolkit;
13 import java.text.DateFormat;
14 import java.util.ArrayList;
15 import java.util.Date;
16 import java.util.Iterator;
17 import java.util.List;
18 import java.util.StringTokenizer;
19
20 /***
21 *
22 * @author Donald A. Leckie
23 * @since January 5, 2003
24 * @version $Revision: 1.6 $, $Date: 2003/05/28 18:08:34 $
25 */
26 class PrintAnalysisResults {
27 private PrintJob m_printJob;
28 private Graphics m_graphics;
29 private int m_printAreaX;
30 private int m_printAreaY;
31 private int m_printAreaWidth;
32 private int m_printAreaHeight;
33 private String m_analysisText;
34 private String m_filePath;
35 private String m_printDate;
36 private int m_pageNumber;
37 private int m_printLineTop;
38 private Font m_font;
39 private FontMetrics m_fontMetrics;
40 private Font m_boldFont;
41 private FontMetrics m_boldFontMetrics;
42 private Font m_exampleFont;
43 private FontMetrics m_exampleFontMetrics;
44 private List m_lineTable;
45 private final String EMPTY_STRING = "";
46 private boolean m_printingExample;
47
48 /***
49 ***********************************************************************
50 */
51 protected PrintAnalysisResults() {
52 }
53
54 /***
55 ***********************************************************************
56 */
57 protected void print() {
58 TextAnalysisResultsEventListener textListener = null;
59
60 try {
61 Toolkit toolkit;
62 PMDViewer viewer;
63 String jobTitle;
64
65 textListener = new GetAnalysisResults();
66 ListenerList.addListener(textListener);
67 toolkit = Toolkit.getDefaultToolkit();
68 viewer = PMDViewer.getViewer();
69 jobTitle = "Print Analysis Results";
70 m_printJob = toolkit.getPrintJob(viewer, jobTitle, null);
71
72 if (m_printJob != null) {
73 Dimension pageSize;
74 int resolution;
75 int margin;
76
77 TextAnalysisResultsEvent.notifyRequestText(this);
78 pageSize = m_printJob.getPageDimension();
79 resolution = m_printJob.getPageResolution();
80 margin = resolution / 2; // 1/2 inch margin
81 m_printAreaX = margin;
82 m_printAreaY = margin;
83 m_printAreaWidth = pageSize.width - margin - margin;
84 m_printAreaHeight = pageSize.height - margin - margin;
85 m_boldFont = new Font("Serif", Font.BOLD, 9);
86 m_boldFontMetrics = PMDViewer.getViewer().getFontMetrics(m_boldFont);
87 m_font = new Font("Serif", Font.PLAIN, 9);
88 m_fontMetrics = PMDViewer.getViewer().getFontMetrics(m_font);
89 m_exampleFont = new Font("Courier", Font.PLAIN, 9);
90 m_exampleFontMetrics = PMDViewer.getViewer().getFontMetrics(m_exampleFont);
91
92 Date date;
93 DateFormat dateFormat;
94
95 date = new Date();
96 dateFormat = DateFormat.getDateTimeInstance();
97 m_printDate = dateFormat.format(date);
98
99 buildLineTable();
100 printAnalysisResults();
101 m_lineTable.clear();
102 m_printJob = null;
103 }
104 } finally {
105 ListenerList.removeListener(textListener);
106 }
107 }
108
109 /***
110 **********************************************************************
111 *
112 */
113 private void buildLineTable() {
114 StringTokenizer parser;
115 PrintLineInfo blankLine;
116
117 parser = new StringTokenizer(m_analysisText, "\n");
118 m_lineTable = new ArrayList(1000);
119 m_filePath = parser.nextToken();
120 blankLine = new PrintLineInfo();
121 blankLine.m_label = EMPTY_STRING;
122 blankLine.m_data = EMPTY_STRING;
123 blankLine.m_labelFont = m_boldFont;
124 blankLine.m_labelFontMetrics = m_boldFontMetrics;
125 blankLine.m_dataFont = m_font;
126 blankLine.m_dataFontMetrics = m_fontMetrics;
127
128 while (parser.hasMoreTokens()) {
129 String textLine = parser.nextToken();
130 boolean startingExample = false;
131
132 if (textLine.startsWith("Example:")) {
133 m_printingExample = true;
134 startingExample = true;
135 } else if (textLine.startsWith("Line:")) {
136 m_printingExample = false;
137 m_lineTable.add(blankLine);
138 m_lineTable.add(blankLine);
139 m_lineTable.add(blankLine);
140 }
141
142 buildPrintLineInfo(textLine, startingExample);
143 }
144 }
145
146 /***
147 **********************************************************************
148 *
149 */
150 private void buildPrintLineInfo(String textLine, boolean startingExample) {
151 PrintLineInfo printLineInfo;
152 int index;
153
154 printLineInfo = new PrintLineInfo();
155 printLineInfo.m_label = EMPTY_STRING;
156 printLineInfo.m_data = textLine;
157 index = textLine.indexOf(':');
158
159 if (index >= 0) {
160 index++;
161 printLineInfo.m_label = textLine.substring(0, index);
162 printLineInfo.m_data = (index < textLine.length()) ? textLine.substring(index) : EMPTY_STRING;
163 }
164
165 if (m_printingExample) {
166 printLineInfo.m_dataFont = m_exampleFont;
167 printLineInfo.m_dataFontMetrics = m_exampleFontMetrics;
168 printLineInfo.m_label = "Example: ";
169 } else {
170 printLineInfo.m_dataFont = m_font;
171 printLineInfo.m_dataFontMetrics = m_fontMetrics;
172
173 }
174
175 printLineInfo.m_labelFont = m_boldFont;
176 printLineInfo.m_labelFontMetrics = m_boldFontMetrics;
177 printLineInfo.m_labelWidth = printLineInfo.m_labelFontMetrics.stringWidth(printLineInfo.m_label);
178 printLineInfo.m_dataWidth = printLineInfo.m_dataFontMetrics.stringWidth(printLineInfo.m_data);
179 printLineInfo.m_labelX = m_printAreaX;
180 printLineInfo.m_dataX = printLineInfo.m_labelX + printLineInfo.m_labelWidth;
181
182 if (m_printingExample && (startingExample == false)) {
183 printLineInfo.m_label = EMPTY_STRING;
184 }
185
186 int dataAreaRight = printLineInfo.m_dataX + printLineInfo.m_dataWidth;
187 int printAreaRight = m_printAreaX + m_printAreaWidth;
188
189 if (dataAreaRight <= printAreaRight) {
190 m_lineTable.add(printLineInfo);
191 } else {
192 buildPrintLineInfoForMultipleLines(printLineInfo);
193 }
194 }
195
196 /***
197 **********************************************************************
198 *
199 */
200 private void buildPrintLineInfoForMultipleLines(PrintLineInfo basePrintLineInfo) {
201 char[] data = basePrintLineInfo.m_data.toCharArray();
202 int printAreaRight = m_printAreaX + m_printAreaWidth;
203 int dataAreaWidth = printAreaRight - basePrintLineInfo.m_dataX;
204 StringBuffer buffer = new StringBuffer(500);
205 boolean createPrintLineInfo = false;
206
207 for (int n = 0; n < data.length; n++) {
208 char theChar = data[n];
209 buffer.append(theChar);
210
211 if ((theChar == ' ') || (theChar == '\n')) {
212 String textLine = buffer.toString();
213
214 if (m_fontMetrics.stringWidth(buffer.toString()) >= dataAreaWidth) {
215 for (int n1 = buffer.length() - 1; n1 >= 0; n1--) {
216 if (buffer.charAt(n1) == ' ') {
217 textLine = textLine.substring(0, n1);
218 buffer.delete(0, n1 + 1);
219 break;
220 }
221 }
222
223 createPrintLineInfo = true;
224 } else if (theChar == '\n') {
225 buffer.setLength(0);
226 createPrintLineInfo = true;
227 }
228
229 if (createPrintLineInfo) {
230 PrintLineInfo printLineInfo;
231
232 printLineInfo = new PrintLineInfo();
233 printLineInfo.m_label = basePrintLineInfo.m_label;
234 printLineInfo.m_data = textLine;
235 printLineInfo.m_labelX = basePrintLineInfo.m_labelX;
236 printLineInfo.m_labelWidth = basePrintLineInfo.m_labelWidth;
237 printLineInfo.m_dataX = basePrintLineInfo.m_dataX;
238 printLineInfo.m_dataWidth = basePrintLineInfo.m_dataWidth;
239 printLineInfo.m_labelFont = basePrintLineInfo.m_labelFont;
240 printLineInfo.m_labelFontMetrics = basePrintLineInfo.m_labelFontMetrics;
241 printLineInfo.m_dataFont = basePrintLineInfo.m_dataFont;
242 printLineInfo.m_dataFontMetrics = basePrintLineInfo.m_dataFontMetrics;
243 m_lineTable.add(printLineInfo);
244
245 // Clear the base label so that it isn't repeated.
246 basePrintLineInfo.m_label = EMPTY_STRING;
247
248 // Setup for next text line
249 createPrintLineInfo = false;
250 }
251 }
252 }
253
254 if (buffer.length() > 0) {
255 PrintLineInfo printLineInfo;
256
257 printLineInfo = new PrintLineInfo();
258 printLineInfo.m_label = basePrintLineInfo.m_label;
259 printLineInfo.m_data = buffer.toString();
260 printLineInfo.m_labelX = basePrintLineInfo.m_labelX;
261 printLineInfo.m_labelWidth = basePrintLineInfo.m_labelWidth;
262 printLineInfo.m_dataX = basePrintLineInfo.m_dataX;
263 printLineInfo.m_dataWidth = basePrintLineInfo.m_dataWidth;
264 printLineInfo.m_labelFont = basePrintLineInfo.m_labelFont;
265 printLineInfo.m_labelFontMetrics = basePrintLineInfo.m_labelFontMetrics;
266 printLineInfo.m_dataFont = basePrintLineInfo.m_dataFont;
267 printLineInfo.m_dataFontMetrics = basePrintLineInfo.m_dataFontMetrics;
268 m_lineTable.add(printLineInfo);
269 }
270 }
271
272 /***
273 **********************************************************************
274 *
275 */
276 private void printAnalysisResults() {
277 int lineHeight;
278 int printAreaBottom;
279 Iterator lineTableIterator;
280
281 lineTableIterator = m_lineTable.iterator();
282 m_printLineTop = m_printAreaY + m_printAreaHeight;
283 lineHeight = m_fontMetrics.getHeight();
284 printAreaBottom = m_printAreaY + m_printAreaHeight;
285
286 while (lineTableIterator.hasNext()) {
287 PrintLineInfo printLineInfo = (PrintLineInfo) lineTableIterator.next();
288
289 if ((m_printLineTop + lineHeight) > printAreaBottom) {
290 endPage();
291 beginPage();
292 printHeader();
293 }
294
295 printBody(printLineInfo);
296 }
297
298 m_printJob.end();
299 }
300
301 /***
302 **********************************************************************
303 *
304 */
305 private void beginPage() {
306 m_graphics = m_printJob.getGraphics();
307 }
308
309 /***
310 **********************************************************************
311 *
312 * <file path> Page 1 <print date>
313 */
314 private void printHeader() {
315 int baseline;
316
317 m_printLineTop = m_printAreaY;
318 baseline = m_printLineTop + m_boldFontMetrics.getAscent();
319 m_graphics.setFont(m_boldFont);
320
321 //
322 // Draw the file path
323 //
324 int fileNameX = m_printAreaX;
325 int fileNameWidth = m_boldFontMetrics.stringWidth(m_filePath);
326 m_graphics.drawString(m_filePath, fileNameX, baseline);
327
328 //
329 // Draw the page number
330 //
331 int pageTextWidth;
332 int pageTextX;
333 String pageText;
334
335 m_pageNumber++;
336 pageText = "Page " + m_pageNumber;
337 pageTextWidth = m_boldFontMetrics.stringWidth(pageText);
338 pageTextX = m_printAreaX + (m_printAreaWidth / 2) - (pageTextWidth / 2);
339
340 if (pageTextX <= (m_printAreaX + fileNameWidth)) {
341 pageTextX = m_printAreaX + fileNameWidth + 10;
342 }
343
344 m_graphics.drawString(pageText, pageTextX, baseline);
345
346 //
347 // Draw the print date
348 //
349 int printDateWidth;
350 int printDateX;
351
352 printDateWidth = m_boldFontMetrics.stringWidth(m_printDate);
353 printDateX = m_printAreaX + m_printAreaWidth - printDateWidth;
354 m_graphics.drawString(m_printDate, printDateX, baseline);
355
356 //
357 // Draw single horizontal line with space above and below.
358 //
359 int x1;
360 int x2;
361
362 m_printLineTop += m_boldFontMetrics.getHeight() + 3;
363 x1 = m_printAreaX;
364 x2 = m_printAreaX + m_printAreaWidth;
365 m_graphics.drawLine(x1, m_printLineTop, x2, m_printLineTop);
366 m_printLineTop += 3;
367 }
368
369 /***
370 **********************************************************************
371 *
372 * @param printLineInfo
373 */
374 private void printBody(PrintLineInfo printLineInfo) {
375 if ((printLineInfo.m_label.length() > 0) || (printLineInfo.m_data.length() > 0)) {
376 int x;
377 int y;
378 int baseline;
379
380 baseline = m_printLineTop + printLineInfo.m_labelFontMetrics.getAscent();
381
382 // Print label
383 if (printLineInfo.m_label.length() > 0) {
384 m_graphics.setFont(printLineInfo.m_labelFont);
385 x = printLineInfo.m_labelX;
386 y = baseline;
387 m_graphics.drawString(printLineInfo.m_label, x, y);
388 }
389
390 // Print data
391 m_graphics.setFont(printLineInfo.m_dataFont);
392 x = printLineInfo.m_dataX;
393 y = baseline;
394 m_graphics.drawString(printLineInfo.m_data, x, y);
395 }
396
397 m_printLineTop += printLineInfo.m_dataFontMetrics.getHeight();
398 }
399
400 /***
401 **********************************************************************
402 *
403 */
404 private void endPage() {
405 m_graphics = null;
406 }
407
408 /***
409 ***********************************************************************
410 ***********************************************************************
411 ***********************************************************************
412 */
413 private class GetAnalysisResults implements TextAnalysisResultsEventListener {
414
415 /***
416 ****************************************************************************
417 *
418 * @param event
419 */
420 public void requestTextAnalysisResults(TextAnalysisResultsEvent event) {
421 }
422
423 /***
424 ****************************************************************************
425 *
426 * @param event
427 */
428 public void returnedTextAnalysisResults(TextAnalysisResultsEvent event) {
429 m_analysisText = event.getText();
430 }
431 }
432
433 /***
434 ***********************************************************************
435 ***********************************************************************
436 ***********************************************************************
437 */
438 private class PrintLineInfo {
439 public String m_label;
440 public String m_data;
441 public int m_labelWidth;
442 public int m_dataWidth;
443 public int m_labelX;
444 public int m_dataX;
445 public Font m_labelFont;
446 public FontMetrics m_labelFontMetrics;
447 public Font m_dataFont;
448 public FontMetrics m_dataFontMetrics;
449 }
450 }
This page was automatically generated by Maven