| 1 28 29 35 package net.sf.jasperreports.view; 36 37 import java.awt.Component ; 38 import java.awt.Container ; 39 import java.awt.Cursor ; 40 import java.awt.Dimension ; 41 import java.awt.Graphics ; 42 import java.awt.Graphics2D ; 43 import java.awt.Image ; 44 import java.awt.Point ; 45 import java.awt.Rectangle ; 46 import java.awt.Toolkit ; 47 import java.awt.event.MouseEvent ; 48 import java.awt.event.MouseListener ; 49 import java.awt.event.MouseMotionListener ; 50 import java.io.File ; 51 import java.io.InputStream ; 52 import java.lang.reflect.Method ; 53 import java.text.DecimalFormat ; 54 import java.text.MessageFormat ; 55 import java.text.ParseException ; 56 import java.util.ArrayList ; 57 import java.util.Arrays ; 58 import java.util.Collection ; 59 import java.util.HashMap ; 60 import java.util.Iterator ; 61 import java.util.List ; 62 import java.util.Locale ; 63 import java.util.Map ; 64 import java.util.ResourceBundle ; 65 66 import javax.swing.DefaultComboBoxModel ; 67 import javax.swing.ImageIcon ; 68 import javax.swing.JFileChooser ; 69 import javax.swing.JLabel ; 70 import javax.swing.JOptionPane ; 71 import javax.swing.JPanel ; 72 import javax.swing.JViewport ; 73 import javax.swing.filechooser.FileFilter ; 74 75 import net.sf.jasperreports.engine.JRException; 76 import net.sf.jasperreports.engine.JRExporterParameter; 77 import net.sf.jasperreports.engine.JRHyperlink; 78 import net.sf.jasperreports.engine.JRImageMapRenderer; 79 import net.sf.jasperreports.engine.JRPrintAnchorIndex; 80 import net.sf.jasperreports.engine.JRPrintElement; 81 import net.sf.jasperreports.engine.JRPrintHyperlink; 82 import net.sf.jasperreports.engine.JRPrintImage; 83 import net.sf.jasperreports.engine.JRPrintImageAreaHyperlink; 84 import net.sf.jasperreports.engine.JRPrintPage; 85 import net.sf.jasperreports.engine.JRRenderable; 86 import net.sf.jasperreports.engine.JRRuntimeException; 87 import net.sf.jasperreports.engine.JasperPrint; 88 import net.sf.jasperreports.engine.JasperPrintManager; 89 import net.sf.jasperreports.engine.export.JRGraphics2DExporter; 90 import net.sf.jasperreports.engine.export.JRGraphics2DExporterParameter; 91 import net.sf.jasperreports.engine.print.JRPrinterAWT; 92 import net.sf.jasperreports.engine.util.JRClassLoader; 93 import net.sf.jasperreports.engine.util.JRLoader; 94 import net.sf.jasperreports.engine.util.JRProperties; 95 import net.sf.jasperreports.engine.xml.JRPrintXmlLoader; 96 import net.sf.jasperreports.view.save.JRPrintSaveContributor; 97 98 99 103 public class JRViewer extends javax.swing.JPanel implements JRHyperlinkListener 104 { 105 106 117 public static final String VIEWER_RENDER_BUFFER_MAX_SIZE = JRProperties.PROPERTY_PREFIX + "viewer.render.buffer.max.size"; 118 119 122 private static final int TYPE_FILE_NAME = 1; 123 private static final int TYPE_INPUT_STREAM = 2; 124 private static final int TYPE_JASPER_PRINT = 3; 125 126 129 public static final int REPORT_RESOLUTION = 72; 130 131 protected float MIN_ZOOM = 0.5f; 132 protected float MAX_ZOOM = 10f; 133 protected int zooms[] = {50, 75, 100, 125, 150, 175, 200, 250, 400, 800}; 134 protected int defaultZoomIndex = 2; 135 136 private int type = TYPE_FILE_NAME; 137 private boolean isXML = false; 138 private String reportFileName = null; 139 JasperPrint jasperPrint = null; 140 private int pageIndex = 0; 141 private float zoom = 0f; 142 143 private JRGraphics2DExporter exporter = null; 144 145 148 private int screenResolution = REPORT_RESOLUTION; 149 150 153 protected float realZoom = 0f; 154 155 private DecimalFormat zoomDecimalFormat = new DecimalFormat ("#.##"); 156 private ResourceBundle resourceBundle = null; 157 158 private int downX = 0; 159 private int downY = 0; 160 161 private java.util.List hyperlinkListeners = new ArrayList (); 162 private Map linksMap = new HashMap (); 163 private MouseListener mouseListener = 164 new java.awt.event.MouseAdapter () 165 { 166 public void mouseClicked(java.awt.event.MouseEvent evt) 167 { 168 hyperlinkClicked(evt); 169 } 170 }; 171 172 private java.util.List saveContributors = new ArrayList (); 173 174 175 176 public JRViewer(String fileName, boolean isXML) throws JRException 177 { 178 this(fileName, isXML, null); 179 } 180 181 182 183 public JRViewer(InputStream is, boolean isXML) throws JRException 184 { 185 this(is, isXML, null); 186 } 187 188 189 190 public JRViewer(JasperPrint jrPrint) 191 { 192 this(jrPrint, null); 193 } 194 195 196 197 public JRViewer(String fileName, boolean isXML, Locale locale) throws JRException 198 { 199 this(fileName, isXML, locale, null); 200 } 201 202 203 204 public JRViewer(InputStream is, boolean isXML, Locale locale) throws JRException 205 { 206 this(is, isXML, locale, null); 207 } 208 209 210 211 public JRViewer(JasperPrint jrPrint, Locale locale) 212 { 213 this(jrPrint, locale, null); 214 } 215 216 217 218 public JRViewer(String fileName, boolean isXML, Locale locale, ResourceBundle resBundle) throws JRException 219 { 220 initResources(locale, resBundle); 221 222 setScreenDetails(); 223 224 setZooms(); 225 226 initComponents(); 227 228 loadReport(fileName, isXML); 229 230 cmbZoom.setSelectedIndex(defaultZoomIndex); 231 232 initSaveContributors(); 233 234 addHyperlinkListener(this); 235 } 236 237 238 239 public JRViewer(InputStream is, boolean isXML, Locale locale, ResourceBundle resBundle) throws JRException 240 { 241 initResources(locale, resBundle); 242 243 setScreenDetails(); 244 245 setZooms(); 246 247 initComponents(); 248 249 loadReport(is, isXML); 250 251 cmbZoom.setSelectedIndex(defaultZoomIndex); 252 253 initSaveContributors(); 254 255 addHyperlinkListener(this); 256 } 257 258 259 260 public JRViewer(JasperPrint jrPrint, Locale locale, ResourceBundle resBundle) 261 { 262 initResources(locale, resBundle); 263 264 setScreenDetails(); 265 266 setZooms(); 267 268 initComponents(); 269 270 loadReport(jrPrint); 271 272 cmbZoom.setSelectedIndex(defaultZoomIndex); 273 274 initSaveContributors(); 275 276 addHyperlinkListener(this); 277 } 278 279 280 private void setScreenDetails() 281 { 282 screenResolution = Toolkit.getDefaultToolkit().getScreenResolution(); 283 } 284 285 286 289 public void clear() 290 { 291 emptyContainer(this); 292 jasperPrint = null; 293 } 294 295 296 299 protected void setZooms() 300 { 301 } 302 303 304 307 public void addSaveContributor(JRSaveContributor contributor) 308 { 309 saveContributors.add(contributor); 310 } 311 312 313 316 public void removeSaveContributor(JRSaveContributor contributor) 317 { 318 saveContributors.remove(contributor); 319 } 320 321 322 325 public JRSaveContributor[] getSaveContributors() 326 { 327 return (JRSaveContributor[])saveContributors.toArray(new JRSaveContributor[saveContributors.size()]); 328 } 329 330 331 334 public void addHyperlinkListener(JRHyperlinkListener listener) 335 { 336 hyperlinkListeners.add(listener); 337 } 338 339 340 343 public void removeHyperlinkListener(JRHyperlinkListener listener) 344 { 345 hyperlinkListeners.remove(listener); 346 } 347 348 349 352 public JRHyperlinkListener[] getHyperlinkListeners() 353 { 354 return (JRHyperlinkListener[])hyperlinkListeners.toArray(new JRHyperlinkListener[hyperlinkListeners.size()]); 355 } 356 357 358 361 protected void initResources(Locale locale, ResourceBundle resBundle) 362 { 363 if (locale != null) 364 setLocale(locale); 365 else 366 setLocale(Locale.getDefault()); 367 368 if (resBundle == null) 369 { 370 this.resourceBundle = ResourceBundle.getBundle("net/sf/jasperreports/view/viewer", getLocale()); 371 } 372 else 373 { 374 this.resourceBundle = resBundle; 375 } 376 } 377 378 379 382 protected String getBundleString(String key) 383 { 384 return resourceBundle.getString(key); 385 } 386 387 388 391 protected void initSaveContributors() 392 { 393 final String [] DEFAULT_CONTRIBUTORS = 394 { 395 "net.sf.jasperreports.view.save.JRPrintSaveContributor", 396 "net.sf.jasperreports.view.save.JRPdfSaveContributor", 397 "net.sf.jasperreports.view.save.JRRtfSaveContributor", 398 "net.sf.jasperreports.view.save.JRHtmlSaveContributor", 399 "net.sf.jasperreports.view.save.JRSingleSheetXlsSaveContributor", 400 "net.sf.jasperreports.view.save.JRMultipleSheetsXlsSaveContributor", 401 "net.sf.jasperreports.view.save.JRCsvSaveContributor", 402 "net.sf.jasperreports.view.save.JRXmlSaveContributor", 403 "net.sf.jasperreports.view.save.JREmbeddedImagesXmlSaveContributor" 404 }; 405 406 for(int i = 0; i < DEFAULT_CONTRIBUTORS.length; i++) 407 { 408 try 409 { 410 Class saveContribClass = JRClassLoader.loadClassForName(DEFAULT_CONTRIBUTORS[i]); 411 Method method = saveContribClass.getMethod("getInstance", (Class [])null); 412 JRSaveContributor saveContrib = (JRSaveContributor)method.invoke(null, (Object [])null); 413 saveContributors.add(saveContrib); 414 } 415 catch (Exception e) 416 { 417 } 418 } 419 } 420 421 422 425 public void gotoHyperlink(JRPrintHyperlink hyperlink) 426 { 427 switch(hyperlink.getHyperlinkType()) 428 { 429 case JRHyperlink.HYPERLINK_TYPE_REFERENCE : 430 { 431 if (isOnlyHyperlinkListener()) 432 { 433 System.out.println("Hyperlink reference : " + hyperlink.getHyperlinkReference()); 434 System.out.println("Implement your own JRHyperlinkListener to manage this type of event."); 435 } 436 break; 437 } 438 case JRHyperlink.HYPERLINK_TYPE_LOCAL_ANCHOR : 439 { 440 if (hyperlink.getHyperlinkAnchor() != null) 441 { 442 Map anchorIndexes = jasperPrint.getAnchorIndexes(); 443 JRPrintAnchorIndex anchorIndex = (JRPrintAnchorIndex)anchorIndexes.get(hyperlink.getHyperlinkAnchor()); 444 if (anchorIndex.getPageIndex() != pageIndex) 445 { 446 setPageIndex(anchorIndex.getPageIndex()); 447 refreshPage(); 448 } 449 Container container = pnlInScroll.getParent(); 450 if (container instanceof JViewport ) 451 { 452 JViewport viewport = (JViewport ) container; 453 454 int newX = (int)(anchorIndex.getElementAbsoluteX() * realZoom); 455 int newY = (int)(anchorIndex.getElementAbsoluteY() * realZoom); 456 457 int maxX = pnlInScroll.getWidth() - viewport.getWidth(); 458 int maxY = pnlInScroll.getHeight() - viewport.getHeight(); 459 460 if (newX < 0) 461 { 462 newX = 0; 463 } 464 if (newX > maxX) 465 { 466 newX = maxX; 467 } 468 if (newY < 0) 469 { 470 newY = 0; 471 } 472 if (newY > maxY) 473 { 474 newY = maxY; 475 } 476 477 viewport.setViewPosition(new Point (newX, newY)); 478 } 479 } 480 481 break; 482 } 483 case JRHyperlink.HYPERLINK_TYPE_LOCAL_PAGE : 484 { 485 int page = pageIndex + 1; 486 if (hyperlink.getHyperlinkPage() != null) 487 { 488 page = hyperlink.getHyperlinkPage().intValue(); 489 } 490 491 if (page >= 1 && page <= jasperPrint.getPages().size() && page != pageIndex + 1) 492 { 493 setPageIndex(page - 1); 494 refreshPage(); 495 Container container = pnlInScroll.getParent(); 496 if (container instanceof JViewport ) 497 { 498 JViewport viewport = (JViewport ) container; 499 viewport.setViewPosition(new Point (0, 0)); 500 } 501 } 502 503 break; 504 } 505 case JRHyperlink.HYPERLINK_TYPE_REMOTE_ANCHOR : 506 { 507 if (isOnlyHyperlinkListener()) 508 { 509 System.out.println("Hyperlink reference : " + hyperlink.getHyperlinkReference()); 510 System.out.println("Hyperlink anchor : " + hyperlink.getHyperlinkAnchor()); 511 System.out.println("Implement your own JRHyperlinkListener to manage this type of event."); 512 } 513 break; 514 } 515 case JRHyperlink.HYPERLINK_TYPE_REMOTE_PAGE : 516 { 517 if (isOnlyHyperlinkListener()) 518 { 519 System.out.println("Hyperlink reference : " + hyperlink.getHyperlinkReference()); 520 System.out.println("Hyperlink page : " + hyperlink.getHyperlinkPage()); 521 System.out.println("Implement your own JRHyperlinkListener to manage this type of event."); 522 } 523 break; 524 } 525 case JRHyperlink.HYPERLINK_TYPE_CUSTOM: 526 { 527 if (isOnlyHyperlinkListener()) 528 { 529 System.out.println("Hyperlink of type " + hyperlink.getLinkType()); 530 System.out.println("Implement your own JRHyperlinkListener to manage this type of event."); 531 } 532 break; 533 } 534 case JRHyperlink.HYPERLINK_TYPE_NONE : 535 default : 536 { 537 break; 538 } 539 } 540 } 541 542 543 protected boolean isOnlyHyperlinkListener() 544 { 545 int listenerCount; 546 if (hyperlinkListeners == null) 547 { 548 listenerCount = 0; 549 } 550 else 551 { 552 listenerCount = hyperlinkListeners.size(); 553 if (hyperlinkListeners.contains(this)) 554 { 555 --listenerCount; 556 } 557 } 558 return listenerCount == 0; 559 } 560 561 562 567 private void initComponents() { 569 java.awt.GridBagConstraints gridBagConstraints; 570 571 tlbToolBar = new javax.swing.JPanel (); 572 btnSave = new javax.swing.JButton (); 573 btnPrint = new javax.swing.JButton (); 574 btnReload = new javax.swing.JButton (); 575 pnlSep01 = new javax.swing.JPanel (); 576 btnFirst = new javax.swing.JButton (); 577 btnPrevious = new javax.swing.JButton (); 578 btnNext = new javax.swing.JButton (); 579 btnLast = new javax.swing.JButton (); 580 txtGoTo = new javax.swing.JTextField (); 581 pnlSep02 = new javax.swing.JPanel (); 582 btnActualSize = new javax.swing.JToggleButton (); 583 btnFitPage = new javax.swing.JToggleButton (); 584 btnFitWidth = new javax.swing.JToggleButton (); 585 pnlSep03 = new javax.swing.JPanel (); 586 btnZoomIn = new javax.swing.JButton (); 587 btnZoomOut = new javax.swing.JButton (); 588 cmbZoom = new javax.swing.JComboBox (); 589 DefaultComboBoxModel model = new DefaultComboBoxModel (); 590 for(int i = 0; i < zooms.length; i++) 591 { 592 model.addElement("" + zooms[i] + "%"); 593 } 594 cmbZoom.setModel(model); 595 596 pnlMain = new javax.swing.JPanel (); 597 scrollPane = new javax.swing.JScrollPane (); 598 scrollPane.getHorizontalScrollBar().setUnitIncrement(5); 599 scrollPane.getVerticalScrollBar().setUnitIncrement(5); 600 601 pnlInScroll = new javax.swing.JPanel (); 602 pnlPage = new javax.swing.JPanel (); 603 jPanel4 = new javax.swing.JPanel (); 604 pnlLinks = new javax.swing.JPanel (); 605 jPanel5 = new javax.swing.JPanel (); 606 jPanel6 = new javax.swing.JPanel (); 607 jPanel7 = new javax.swing.JPanel (); 608 jPanel8 = new javax.swing.JPanel (); 609 jLabel1 = new javax.swing.JLabel (); 610 jPanel9 = new javax.swing.JPanel (); 611 lblPage = new PageRenderer(this); 612 pnlStatus = new javax.swing.JPanel (); 613 lblStatus = new javax.swing.JLabel (); 614 615 setLayout(new java.awt.BorderLayout ()); 616 617 setMinimumSize(new java.awt.Dimension (450, 150)); 618 setPreferredSize(new java.awt.Dimension (450, 150)); 619 tlbToolBar.setLayout(new java.awt.FlowLayout (java.awt.FlowLayout.LEFT, 0, 2)); 620 621 btnSave.setIcon(new javax.swing.ImageIcon (getClass().getResource("/net/sf/jasperreports/view/images/save.GIF"))); 622 btnSave.setToolTipText(getBundleString("save")); 623 btnSave.setMargin(new java.awt.Insets (2, 2, 2, 2)); 624 btnSave.setMaximumSize(new java.awt.Dimension (23, 23)); 625 btnSave.setMinimumSize(new java.awt.Dimension (23, 23)); 626 btnSave.setPreferredSize(new java.awt.Dimension (23, 23)); 627 btnSave.addActionListener(new java.awt.event.ActionListener () { 628 public void actionPerformed(java.awt.event.ActionEvent evt) { 629 btnSaveActionPerformed(evt); 630 } 631 }); 632 633 tlbToolBar.add(btnSave); 634 635 btnPrint.setIcon(new javax.swing.ImageIcon (getClass().getResource("/net/sf/jasperreports/view/images/print.GIF"))); 636 btnPrint.setToolTipText(getBundleString("print")); 637 btnPrint.setMargin(new java.awt.Insets (2, 2, 2, 2)); 638 btnPrint.setMaximumSize(new java.awt.Dimension (23, 23)); 639 btnPrint.setMinimumSize(new java.awt.Dimension (23, 23)); 640 btnPrint.setPreferredSize(new java.awt.Dimension (23, 23)); 641 btnPrint.addActionListener(new java.awt.event.ActionListener () { 642 public void actionPerformed(java.awt.event.ActionEvent evt) { 643 btnPrintActionPerformed(evt); 644 } 645 }); 646 647 tlbToolBar.add(btnPrint); 648 649 btnReload.setIcon(new javax.swing.ImageIcon (getClass().getResource("/net/sf/jasperreports/view/images/reload.GIF"))); 650 btnReload.setToolTipText(getBundleString("reload")); 651 btnReload.setMargin(new java.awt.Insets (2, 2, 2, 2)); 652 btnReload.setMaximumSize(new java.awt.Dimension (23, 23)); 653 btnReload.setMinimumSize(new java.awt.Dimension (23, 23)); 654 btnReload.setPreferredSize(new java.awt.Dimension (23, 23)); 655 btnReload.addActionListener(new java.awt.event.ActionListener () { 656 public void actionPerformed(java.awt.event.ActionEvent evt) { 657 btnReloadActionPerformed(evt); 658 } 659 }); 660 661 tlbToolBar.add(btnReload); 662 663 pnlSep01.setMaximumSize(new java.awt.Dimension (10, 10)); 664 tlbToolBar.add(pnlSep01); 665 666 btnFirst.setIcon(new javax.swing.ImageIcon (getClass().getResource("/net/sf/jasperreports/view/images/first.GIF"))); 667 btnFirst.setToolTipText(getBundleString("first.page")); 668 btnFirst.setMargin(new java.awt.Insets (2, 2, 2, 2)); 669 btnFirst.setMaximumSize(new java.awt.Dimension (23, 23)); 670 btnFirst.setMinimumSize(new java.awt.Dimension (23, 23)); 671 btnFirst.setPreferredSize(new java.awt.Dimension (23, 23)); 672 btnFirst.addActionListener(new java.awt.event.ActionListener () { 673 public void actionPerformed(java.awt.event.ActionEvent evt) { 674 btnFirstActionPerformed(evt); 675 } 676 }); 677 678 tlbToolBar.add(btnFirst); 679 680 btnPrevious.setIcon(new javax.swing.ImageIcon (getClass().getResource("/net/sf/jasperreports/view/images/previous.GIF"))); 681 btnPrevious.setToolTipText(getBundleString("previous.page")); 682 btnPrevious.setMargin(new java.awt.Insets (2, 2, 2, 2)); 683 btnPrevious.setMaximumSize(new java.awt.Dimension (23, 23)); 684 btnPrevious.setMinimumSize(new java.awt.Dimension (23, 23)); 685 btnPrevious.setPreferredSize(new java.awt.Dimension (23, 23)); 686 btnPrevious.addActionListener(new java.awt.event.ActionListener () { 687 public void actionPerformed(java.awt.event.ActionEvent evt) { 688 btnPreviousActionPerformed(evt); 689 } 690 }); 691 692 tlbToolBar.add(btnPrevious); 693 694 btnNext.setIcon(new javax.swing.ImageIcon (getClass().getResource("/net/sf/jasperreports/view/images/next.GIF"))); 695 btnNext.setToolTipText(getBundleString("next.page")); 696 btnNext.setMargin(new java.awt.Insets (2, 2, 2, 2)); 697 btnNext.setMaximumSize(new java.awt.Dimension (23, 23)); 698 btnNext.setMinimumSize(new java.awt.Dimension (23, 23)); 699 btnNext.setPreferredSize(new java.awt.Dimension (23, 23)); 700 btnNext.addActionListener(new java.awt.event.ActionListener () { 701 public void actionPerformed(java.awt.event.ActionEvent evt) { 702 btnNextActionPerformed(evt); 703 } 704 }); 705 706 tlbToolBar.add(btnNext); 707 708 btnLast.setIcon(new javax.swing.ImageIcon (getClass().getResource("/net/sf/jasperreports/view/images/last.GIF"))); 709 btnLast.setToolTipText(getBundleString("last.page")); 710 btnLast.setMargin(new java.awt.Insets (2, 2, 2, 2)); 711 btnLast.setMaximumSize(new java.awt.Dimension (23, 23)); 712 btnLast.setMinimumSize(new java.awt.Dimension (23, 23)); 713 btnLast.setPreferredSize(new java.awt.Dimension (23, 23)); 714 btnLast.addActionListener(new java.awt.event.ActionListener () { 715 public void actionPerformed(java.awt.event.ActionEvent  |