View Javadoc
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