001/* ====================================================== 002 * JFreeChart : a chart library for the Java(tm) platform 003 * ====================================================== 004 * 005 * (C) Copyright 2000-present, by David Gilbert and Contributors. 006 * 007 * Project Info: https://www.jfree.org/jfreechart/index.html 008 * 009 * This library is free software; you can redistribute it and/or modify it 010 * under the terms of the GNU Lesser General Public License as published by 011 * the Free Software Foundation; either version 2.1 of the License, or 012 * (at your option) any later version. 013 * 014 * This library is distributed in the hope that it will be useful, but 015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 017 * License for more details. 018 * 019 * You should have received a copy of the GNU Lesser General Public 020 * License along with this library; if not, write to the Free Software 021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 022 * USA. 023 * 024 * [Oracle and Java are registered trademarks of Oracle and/or its affiliates. 025 * Other names may be trademarks of their respective owners.] 026 * 027 * --------------- 028 * ChartUtils.java 029 * --------------- 030 * (C) Copyright 2001-present, by David Gilbert and Contributors. 031 * 032 * Original Author: David Gilbert; 033 * Contributor(s): Wolfgang Irler; 034 * Richard Atkinson; 035 * Xavier Poinsard; 036 * 037 */ 038 039package org.jfree.chart; 040 041import java.awt.Graphics2D; 042import java.awt.geom.AffineTransform; 043import java.awt.geom.Rectangle2D; 044import java.awt.image.BufferedImage; 045import java.io.BufferedOutputStream; 046import java.io.File; 047import java.io.FileOutputStream; 048import java.io.IOException; 049import java.io.OutputStream; 050import java.io.PrintWriter; 051 052import org.jfree.chart.encoders.EncoderUtil; 053import org.jfree.chart.encoders.ImageFormat; 054import org.jfree.chart.imagemap.ImageMapUtils; 055import org.jfree.chart.imagemap.OverLIBToolTipTagFragmentGenerator; 056import org.jfree.chart.imagemap.StandardToolTipTagFragmentGenerator; 057import org.jfree.chart.imagemap.StandardURLTagFragmentGenerator; 058import org.jfree.chart.imagemap.ToolTipTagFragmentGenerator; 059import org.jfree.chart.imagemap.URLTagFragmentGenerator; 060import org.jfree.chart.util.Args; 061 062/** 063 * A collection of utility methods for JFreeChart. Includes methods for 064 * converting charts to image formats (PNG and JPEG) plus creating simple HTML 065 * image maps. 066 * 067 * @see ImageMapUtils 068 */ 069public abstract class ChartUtils { 070 071 private ChartUtils() { 072 // no requirement to instantiate 073 } 074 075 /** 076 * Applies the current theme to the specified chart. This method is 077 * provided for convenience, the theme itself is stored in the 078 * {@link ChartFactory} class. 079 * 080 * @param chart the chart ({@code null} not permitted). 081 */ 082 public static void applyCurrentTheme(JFreeChart chart) { 083 ChartFactory.getChartTheme().apply(chart); 084 } 085 086 /** 087 * Writes a chart to an output stream in PNG format. 088 * 089 * @param out the output stream ({@code null} not permitted). 090 * @param chart the chart ({@code null} not permitted). 091 * @param width the image width. 092 * @param height the image height. 093 * 094 * @throws IOException if there are any I/O errors. 095 */ 096 public static void writeChartAsPNG(OutputStream out, JFreeChart chart, 097 int width, int height) throws IOException { 098 099 // defer argument checking... 100 writeChartAsPNG(out, chart, width, height, null); 101 102 } 103 104 /** 105 * Writes a chart to an output stream in PNG format. 106 * 107 * @param out the output stream ({@code null} not permitted). 108 * @param chart the chart ({@code null} not permitted). 109 * @param width the image width. 110 * @param height the image height. 111 * @param encodeAlpha encode alpha? 112 * @param compression the compression level (0-9). 113 * 114 * @throws IOException if there are any I/O errors. 115 */ 116 public static void writeChartAsPNG(OutputStream out, JFreeChart chart, 117 int width, int height, boolean encodeAlpha, int compression) 118 throws IOException { 119 120 // defer argument checking... 121 ChartUtils.writeChartAsPNG(out, chart, width, height, null, 122 encodeAlpha, compression); 123 124 } 125 126 /** 127 * Writes a chart to an output stream in PNG format. This method allows 128 * you to pass in a {@link ChartRenderingInfo} object, to collect 129 * information about the chart dimensions/entities. You will need this 130 * info if you want to create an HTML image map. 131 * 132 * @param out the output stream ({@code null} not permitted). 133 * @param chart the chart ({@code null} not permitted). 134 * @param width the image width. 135 * @param height the image height. 136 * @param info the chart rendering info ({@code null} permitted). 137 * 138 * @throws IOException if there are any I/O errors. 139 */ 140 public static void writeChartAsPNG(OutputStream out, JFreeChart chart, 141 int width, int height, ChartRenderingInfo info) 142 throws IOException { 143 144 Args.nullNotPermitted(chart, "chart"); 145 BufferedImage bufferedImage 146 = chart.createBufferedImage(width, height, info); 147 EncoderUtil.writeBufferedImage(bufferedImage, ImageFormat.PNG, out); 148 } 149 150 /** 151 * Writes a chart to an output stream in PNG format. This method allows 152 * you to pass in a {@link ChartRenderingInfo} object, to collect 153 * information about the chart dimensions/entities. You will need this 154 * info if you want to create an HTML image map. 155 * 156 * @param out the output stream ({@code null} not permitted). 157 * @param chart the chart ({@code null} not permitted). 158 * @param width the image width. 159 * @param height the image height. 160 * @param info carries back chart rendering info ({@code null} 161 * permitted). 162 * @param encodeAlpha encode alpha? 163 * @param compression the PNG compression level (0-9). 164 * 165 * @throws IOException if there are any I/O errors. 166 */ 167 public static void writeChartAsPNG(OutputStream out, JFreeChart chart, 168 int width, int height, ChartRenderingInfo info, 169 boolean encodeAlpha, int compression) throws IOException { 170 171 Args.nullNotPermitted(out, "out"); 172 Args.nullNotPermitted(chart, "chart"); 173 BufferedImage chartImage = chart.createBufferedImage(width, height, 174 BufferedImage.TYPE_INT_ARGB, info); 175 ChartUtils.writeBufferedImageAsPNG(out, chartImage, encodeAlpha, 176 compression); 177 178 } 179 180 /** 181 * Writes a scaled version of a chart to an output stream in PNG format. 182 * 183 * @param out the output stream ({@code null} not permitted). 184 * @param chart the chart ({@code null} not permitted). 185 * @param width the unscaled chart width. 186 * @param height the unscaled chart height. 187 * @param widthScaleFactor the horizontal scale factor. 188 * @param heightScaleFactor the vertical scale factor. 189 * 190 * @throws IOException if there are any I/O problems. 191 */ 192 public static void writeScaledChartAsPNG(OutputStream out, 193 JFreeChart chart, int width, int height, int widthScaleFactor, 194 int heightScaleFactor) throws IOException { 195 196 Args.nullNotPermitted(out, "out"); 197 Args.nullNotPermitted(chart, "chart"); 198 199 double desiredWidth = width * widthScaleFactor; 200 double desiredHeight = height * heightScaleFactor; 201 double defaultWidth = width; 202 double defaultHeight = height; 203 boolean scale = false; 204 205 // get desired width and height from somewhere then... 206 if ((widthScaleFactor != 1) || (heightScaleFactor != 1)) { 207 scale = true; 208 } 209 210 double scaleX = desiredWidth / defaultWidth; 211 double scaleY = desiredHeight / defaultHeight; 212 213 BufferedImage image = new BufferedImage((int) desiredWidth, 214 (int) desiredHeight, BufferedImage.TYPE_INT_ARGB); 215 Graphics2D g2 = image.createGraphics(); 216 217 if (scale) { 218 AffineTransform saved = g2.getTransform(); 219 g2.transform(AffineTransform.getScaleInstance(scaleX, scaleY)); 220 chart.draw(g2, new Rectangle2D.Double(0, 0, defaultWidth, 221 defaultHeight), null, null); 222 g2.setTransform(saved); 223 g2.dispose(); 224 } 225 else { 226 chart.draw(g2, new Rectangle2D.Double(0, 0, defaultWidth, 227 defaultHeight), null, null); 228 } 229 out.write(encodeAsPNG(image)); 230 231 } 232 233 /** 234 * Saves a chart to the specified file in PNG format. 235 * 236 * @param file the file name ({@code null} not permitted). 237 * @param chart the chart ({@code null} not permitted). 238 * @param width the image width. 239 * @param height the image height. 240 * 241 * @throws IOException if there are any I/O errors. 242 */ 243 public static void saveChartAsPNG(File file, JFreeChart chart, 244 int width, int height) throws IOException { 245 246 // defer argument checking... 247 saveChartAsPNG(file, chart, width, height, null); 248 249 } 250 251 /** 252 * Saves a chart to a file in PNG format. This method allows you to pass 253 * in a {@link ChartRenderingInfo} object, to collect information about the 254 * chart dimensions/entities. You will need this info if you want to 255 * create an HTML image map. 256 * 257 * @param file the file ({@code null} not permitted). 258 * @param chart the chart ({@code null} not permitted). 259 * @param width the image width. 260 * @param height the image height. 261 * @param info the chart rendering info ({@code null} permitted). 262 * 263 * @throws IOException if there are any I/O errors. 264 */ 265 public static void saveChartAsPNG(File file, JFreeChart chart, 266 int width, int height, ChartRenderingInfo info) 267 throws IOException { 268 269 Args.nullNotPermitted(file, "file"); 270 OutputStream out = new BufferedOutputStream(new FileOutputStream(file)); 271 try { 272 ChartUtils.writeChartAsPNG(out, chart, width, height, info); 273 } 274 finally { 275 out.close(); 276 } 277 } 278 279 /** 280 * Saves a chart to a file in PNG format. This method allows you to pass 281 * in a {@link ChartRenderingInfo} object, to collect information about the 282 * chart dimensions/entities. You will need this info if you want to 283 * create an HTML image map. 284 * 285 * @param file the file ({@code null} not permitted). 286 * @param chart the chart ({@code null} not permitted). 287 * @param width the image width. 288 * @param height the image height. 289 * @param info the chart rendering info ({@code null} permitted). 290 * @param encodeAlpha encode alpha? 291 * @param compression the PNG compression level (0-9). 292 * 293 * @throws IOException if there are any I/O errors. 294 */ 295 public static void saveChartAsPNG(File file, JFreeChart chart, 296 int width, int height, ChartRenderingInfo info, boolean encodeAlpha, 297 int compression) throws IOException { 298 299 Args.nullNotPermitted(file, "file"); 300 Args.nullNotPermitted(chart, "chart"); 301 OutputStream out = new BufferedOutputStream(new FileOutputStream(file)); 302 try { 303 writeChartAsPNG(out, chart, width, height, info, encodeAlpha, 304 compression); 305 } 306 finally { 307 out.close(); 308 } 309 310 } 311 312 /** 313 * Writes a chart to an output stream in JPEG format. Please note that 314 * JPEG is a poor format for chart images, use PNG if possible. 315 * 316 * @param out the output stream ({@code null} not permitted). 317 * @param chart the chart ({@code null} not permitted). 318 * @param width the image width. 319 * @param height the image height. 320 * 321 * @throws IOException if there are any I/O errors. 322 */ 323 public static void writeChartAsJPEG(OutputStream out, 324 JFreeChart chart, int width, int height) throws IOException { 325 326 // defer argument checking... 327 writeChartAsJPEG(out, chart, width, height, null); 328 329 } 330 331 /** 332 * Writes a chart to an output stream in JPEG format. Please note that 333 * JPEG is a poor format for chart images, use PNG if possible. 334 * 335 * @param out the output stream ({@code null} not permitted). 336 * @param quality the quality setting. 337 * @param chart the chart ({@code null} not permitted). 338 * @param width the image width. 339 * @param height the image height. 340 * 341 * @throws IOException if there are any I/O errors. 342 */ 343 public static void writeChartAsJPEG(OutputStream out, float quality, 344 JFreeChart chart, int width, int height) throws IOException { 345 346 // defer argument checking... 347 ChartUtils.writeChartAsJPEG(out, quality, chart, width, height, 348 null); 349 350 } 351 352 /** 353 * Writes a chart to an output stream in JPEG format. This method allows 354 * you to pass in a {@link ChartRenderingInfo} object, to collect 355 * information about the chart dimensions/entities. You will need this 356 * info if you want to create an HTML image map. 357 * 358 * @param out the output stream ({@code null} not permitted). 359 * @param chart the chart ({@code null} not permitted). 360 * @param width the image width. 361 * @param height the image height. 362 * @param info the chart rendering info ({@code null} permitted). 363 * 364 * @throws IOException if there are any I/O errors. 365 */ 366 public static void writeChartAsJPEG(OutputStream out, JFreeChart chart, 367 int width, int height, ChartRenderingInfo info) 368 throws IOException { 369 370 Args.nullNotPermitted(out, "out"); 371 Args.nullNotPermitted(chart, "chart"); 372 BufferedImage image = chart.createBufferedImage(width, height, 373 BufferedImage.TYPE_INT_RGB, info); 374 EncoderUtil.writeBufferedImage(image, ImageFormat.JPEG, out); 375 376 } 377 378 /** 379 * Writes a chart to an output stream in JPEG format. This method allows 380 * you to pass in a {@link ChartRenderingInfo} object, to collect 381 * information about the chart dimensions/entities. You will need this 382 * info if you want to create an HTML image map. 383 * 384 * @param out the output stream ({@code null} not permitted). 385 * @param quality the output quality (0.0f to 1.0f). 386 * @param chart the chart ({@code null} not permitted). 387 * @param width the image width. 388 * @param height the image height. 389 * @param info the chart rendering info ({@code null} permitted). 390 * 391 * @throws IOException if there are any I/O errors. 392 */ 393 public static void writeChartAsJPEG(OutputStream out, float quality, 394 JFreeChart chart, int width, int height, ChartRenderingInfo info) 395 throws IOException { 396 397 Args.nullNotPermitted(out, "out"); 398 Args.nullNotPermitted(chart, "chart"); 399 BufferedImage image = chart.createBufferedImage(width, height, 400 BufferedImage.TYPE_INT_RGB, info); 401 EncoderUtil.writeBufferedImage(image, ImageFormat.JPEG, out, quality); 402 403 } 404 405 /** 406 * Saves a chart to a file in JPEG format. 407 * 408 * @param file the file ({@code null} not permitted). 409 * @param chart the chart ({@code null} not permitted). 410 * @param width the image width. 411 * @param height the image height. 412 * 413 * @throws IOException if there are any I/O errors. 414 */ 415 public static void saveChartAsJPEG(File file, JFreeChart chart, 416 int width, int height) throws IOException { 417 418 // defer argument checking... 419 saveChartAsJPEG(file, chart, width, height, null); 420 421 } 422 423 /** 424 * Saves a chart to a file in JPEG format. 425 * 426 * @param file the file ({@code null} not permitted). 427 * @param quality the JPEG quality setting. 428 * @param chart the chart ({@code null} not permitted). 429 * @param width the image width. 430 * @param height the image height. 431 * 432 * @throws IOException if there are any I/O errors. 433 */ 434 public static void saveChartAsJPEG(File file, float quality, 435 JFreeChart chart, int width, int height) throws IOException { 436 437 // defer argument checking... 438 saveChartAsJPEG(file, quality, chart, width, height, null); 439 440 } 441 442 /** 443 * Saves a chart to a file in JPEG format. This method allows you to pass 444 * in a {@link ChartRenderingInfo} object, to collect information about the 445 * chart dimensions/entities. You will need this info if you want to 446 * create an HTML image map. 447 * 448 * @param file the file name ({@code null} not permitted). 449 * @param chart the chart ({@code null} not permitted). 450 * @param width the image width. 451 * @param height the image height. 452 * @param info the chart rendering info ({@code null} permitted). 453 * 454 * @throws IOException if there are any I/O errors. 455 */ 456 public static void saveChartAsJPEG(File file, JFreeChart chart, 457 int width, int height, ChartRenderingInfo info) throws IOException { 458 459 Args.nullNotPermitted(file, "file"); 460 Args.nullNotPermitted(chart, "chart"); 461 OutputStream out = new BufferedOutputStream(new FileOutputStream(file)); 462 try { 463 writeChartAsJPEG(out, chart, width, height, info); 464 } 465 finally { 466 out.close(); 467 } 468 469 } 470 471 /** 472 * Saves a chart to a file in JPEG format. This method allows you to pass 473 * in a {@link ChartRenderingInfo} object, to collect information about the 474 * chart dimensions/entities. You will need this info if you want to 475 * create an HTML image map. 476 * 477 * @param file the file name ({@code null} not permitted). 478 * @param quality the quality setting. 479 * @param chart the chart ({@code null} not permitted). 480 * @param width the image width. 481 * @param height the image height. 482 * @param info the chart rendering info ({@code null} permitted). 483 * 484 * @throws IOException if there are any I/O errors. 485 */ 486 public static void saveChartAsJPEG(File file, float quality, 487 JFreeChart chart, int width, int height, 488 ChartRenderingInfo info) throws IOException { 489 490 Args.nullNotPermitted(file, "file"); 491 Args.nullNotPermitted(chart, "chart"); 492 OutputStream out = new BufferedOutputStream(new FileOutputStream( 493 file)); 494 try { 495 writeChartAsJPEG(out, quality, chart, width, height, info); 496 } 497 finally { 498 out.close(); 499 } 500 501 } 502 503 /** 504 * Writes a {@link BufferedImage} to an output stream in JPEG format. 505 * 506 * @param out the output stream ({@code null} not permitted). 507 * @param image the image ({@code null} not permitted). 508 * 509 * @throws IOException if there are any I/O errors. 510 */ 511 public static void writeBufferedImageAsJPEG(OutputStream out, 512 BufferedImage image) throws IOException { 513 514 // defer argument checking... 515 writeBufferedImageAsJPEG(out, 0.75f, image); 516 517 } 518 519 /** 520 * Writes a {@link BufferedImage} to an output stream in JPEG format. 521 * 522 * @param out the output stream ({@code null} not permitted). 523 * @param quality the image quality (0.0f to 1.0f). 524 * @param image the image ({@code null} not permitted). 525 * 526 * @throws IOException if there are any I/O errors. 527 */ 528 public static void writeBufferedImageAsJPEG(OutputStream out, float quality, 529 BufferedImage image) throws IOException { 530 531 EncoderUtil.writeBufferedImage(image, ImageFormat.JPEG, out, quality); 532 533 } 534 535 /** 536 * Writes a {@link BufferedImage} to an output stream in PNG format. 537 * 538 * @param out the output stream ({@code null} not permitted). 539 * @param image the image ({@code null} not permitted). 540 * 541 * @throws IOException if there are any I/O errors. 542 */ 543 public static void writeBufferedImageAsPNG(OutputStream out, 544 BufferedImage image) throws IOException { 545 546 EncoderUtil.writeBufferedImage(image, ImageFormat.PNG, out); 547 548 } 549 550 /** 551 * Writes a {@link BufferedImage} to an output stream in PNG format. 552 * 553 * @param out the output stream ({@code null} not permitted). 554 * @param image the image ({@code null} not permitted). 555 * @param encodeAlpha encode alpha? 556 * @param compression the compression level (0-9). 557 * 558 * @throws IOException if there are any I/O errors. 559 */ 560 public static void writeBufferedImageAsPNG(OutputStream out, 561 BufferedImage image, boolean encodeAlpha, int compression) 562 throws IOException { 563 564 EncoderUtil.writeBufferedImage(image, ImageFormat.PNG, out, 565 compression, encodeAlpha); 566 } 567 568 /** 569 * Encodes a {@link BufferedImage} to PNG format. 570 * 571 * @param image the image ({@code null} not permitted). 572 * 573 * @return A byte array in PNG format. 574 * 575 * @throws IOException if there is an I/O problem. 576 */ 577 public static byte[] encodeAsPNG(BufferedImage image) throws IOException { 578 return EncoderUtil.encode(image, ImageFormat.PNG); 579 } 580 581 /** 582 * Encodes a {@link BufferedImage} to PNG format. 583 * 584 * @param image the image ({@code null} not permitted). 585 * @param encodeAlpha encode alpha? 586 * @param compression the PNG compression level (0-9). 587 * 588 * @return The byte array in PNG format. 589 * 590 * @throws IOException if there is an I/O problem. 591 */ 592 public static byte[] encodeAsPNG(BufferedImage image, boolean encodeAlpha, 593 int compression) throws IOException { 594 return EncoderUtil.encode(image, ImageFormat.PNG, compression, 595 encodeAlpha); 596 } 597 598 /** 599 * Writes an image map to an output stream. 600 * 601 * @param writer the writer ({@code null} not permitted). 602 * @param name the map name ({@code null} not permitted). 603 * @param info the chart rendering info ({@code null} not permitted). 604 * @param useOverLibForToolTips whether to use OverLIB for tooltips 605 * (http://www.bosrup.com/web/overlib/). 606 * 607 * @throws IOException if there are any I/O errors. 608 */ 609 public static void writeImageMap(PrintWriter writer, String name, 610 ChartRenderingInfo info, boolean useOverLibForToolTips) 611 throws IOException { 612 613 ToolTipTagFragmentGenerator toolTipTagFragmentGenerator; 614 if (useOverLibForToolTips) { 615 toolTipTagFragmentGenerator 616 = new OverLIBToolTipTagFragmentGenerator(); 617 } 618 else { 619 toolTipTagFragmentGenerator 620 = new StandardToolTipTagFragmentGenerator(); 621 } 622 ImageMapUtils.writeImageMap(writer, name, info, 623 toolTipTagFragmentGenerator, 624 new StandardURLTagFragmentGenerator()); 625 626 } 627 628 /** 629 * Writes an image map to the specified writer. 630 * 631 * @param writer the writer ({@code null} not permitted). 632 * @param name the map name ({@code null} not permitted). 633 * @param info the chart rendering info ({@code null} not permitted). 634 * @param toolTipTagFragmentGenerator a generator for the HTML fragment 635 * that will contain the tooltip text ({@code null} not permitted 636 * if {@code info} contains tooltip information). 637 * @param urlTagFragmentGenerator a generator for the HTML fragment that 638 * will contain the URL reference ({@code null} not permitted if 639 * {@code info} contains URLs). 640 * 641 * @throws IOException if there are any I/O errors. 642 */ 643 public static void writeImageMap(PrintWriter writer, String name, 644 ChartRenderingInfo info, 645 ToolTipTagFragmentGenerator toolTipTagFragmentGenerator, 646 URLTagFragmentGenerator urlTagFragmentGenerator) 647 throws IOException { 648 649 writer.println(ImageMapUtils.getImageMap(name, info, 650 toolTipTagFragmentGenerator, urlTagFragmentGenerator)); 651 } 652 653 /** 654 * Creates an HTML image map. This method maps to 655 * {@link ImageMapUtils#getImageMap(String, ChartRenderingInfo, 656 * ToolTipTagFragmentGenerator, URLTagFragmentGenerator)}, using default 657 * generators. 658 * 659 * @param name the map name ({@code null} not permitted). 660 * @param info the chart rendering info ({@code null} not permitted). 661 * 662 * @return The map tag. 663 */ 664 public static String getImageMap(String name, ChartRenderingInfo info) { 665 return ImageMapUtils.getImageMap(name, info, 666 new StandardToolTipTagFragmentGenerator(), 667 new StandardURLTagFragmentGenerator()); 668 } 669 670 /** 671 * Creates an HTML image map. This method maps directly to 672 * {@link ImageMapUtils#getImageMap(String, ChartRenderingInfo, 673 * ToolTipTagFragmentGenerator, URLTagFragmentGenerator)}. 674 * 675 * @param name the map name ({@code null} not permitted). 676 * @param info the chart rendering info ({@code null} not permitted). 677 * @param toolTipTagFragmentGenerator a generator for the HTML fragment 678 * that will contain the tooltip text ({@code null} not permitted 679 * if {@code info} contains tooltip information). 680 * @param urlTagFragmentGenerator a generator for the HTML fragment that 681 * will contain the URL reference ({@code null} not permitted if 682 * {@code info} contains URLs). 683 * 684 * @return The map tag. 685 */ 686 public static String getImageMap(String name, ChartRenderingInfo info, 687 ToolTipTagFragmentGenerator toolTipTagFragmentGenerator, 688 URLTagFragmentGenerator urlTagFragmentGenerator) { 689 690 return ImageMapUtils.getImageMap(name, info, 691 toolTipTagFragmentGenerator, urlTagFragmentGenerator); 692 693 } 694 695}