KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > jasperreports > view > JRDesignViewer


1 /*
2  * ============================================================================
3  * GNU Lesser General Public License
4  * ============================================================================
5  *
6  * JasperReports - Free Java report-generating library.
7  * Copyright (C) 2001-2006 JasperSoft Corporation http://www.jaspersoft.com
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
22  *
23  * JasperSoft Corporation
24  * 303 Second Street, Suite 450 North
25  * San Francisco, CA 94107
26  * http://www.jaspersoft.com
27  */

28 package net.sf.jasperreports.view;
29
30 import java.awt.BasicStroke JavaDoc;
31 import java.awt.Color JavaDoc;
32 import java.awt.Container JavaDoc;
33 import java.awt.Cursor JavaDoc;
34 import java.awt.Dimension JavaDoc;
35 import java.awt.Graphics2D JavaDoc;
36 import java.awt.Image JavaDoc;
37 import java.awt.Point JavaDoc;
38 import java.awt.RenderingHints JavaDoc;
39 import java.awt.Shape JavaDoc;
40 import java.awt.Stroke JavaDoc;
41 import java.awt.Toolkit JavaDoc;
42 import java.awt.font.TextAttribute JavaDoc;
43 import java.awt.geom.AffineTransform JavaDoc;
44 import java.awt.image.BufferedImage JavaDoc;
45 import java.io.InputStream JavaDoc;
46 import java.util.Collection JavaDoc;
47 import java.util.HashMap JavaDoc;
48 import java.util.Iterator JavaDoc;
49 import java.util.List JavaDoc;
50 import java.util.Map JavaDoc;
51
52 import javax.swing.DefaultComboBoxModel JavaDoc;
53 import javax.swing.ImageIcon JavaDoc;
54 import javax.swing.JOptionPane JavaDoc;
55 import javax.swing.JViewport JavaDoc;
56
57 import net.sf.jasperreports.crosstabs.JRCellContents;
58 import net.sf.jasperreports.crosstabs.JRCrosstab;
59 import net.sf.jasperreports.crosstabs.JRCrosstabCell;
60 import net.sf.jasperreports.crosstabs.JRCrosstabColumnGroup;
61 import net.sf.jasperreports.crosstabs.JRCrosstabRowGroup;
62 import net.sf.jasperreports.crosstabs.fill.calculation.BucketDefinition;
63 import net.sf.jasperreports.engine.JRAlignment;
64 import net.sf.jasperreports.engine.JRBand;
65 import net.sf.jasperreports.engine.JRBox;
66 import net.sf.jasperreports.engine.JRBreak;
67 import net.sf.jasperreports.engine.JRChart;
68 import net.sf.jasperreports.engine.JRChild;
69 import net.sf.jasperreports.engine.JRElement;
70 import net.sf.jasperreports.engine.JRElementGroup;
71 import net.sf.jasperreports.engine.JREllipse;
72 import net.sf.jasperreports.engine.JRException;
73 import net.sf.jasperreports.engine.JRExpression;
74 import net.sf.jasperreports.engine.JRExpressionChunk;
75 import net.sf.jasperreports.engine.JRFrame;
76 import net.sf.jasperreports.engine.JRGraphicElement;
77 import net.sf.jasperreports.engine.JRGroup;
78 import net.sf.jasperreports.engine.JRImage;
79 import net.sf.jasperreports.engine.JRLine;
80 import net.sf.jasperreports.engine.JRRectangle;
81 import net.sf.jasperreports.engine.JRReport;
82 import net.sf.jasperreports.engine.JRStaticText;
83 import net.sf.jasperreports.engine.JRSubreport;
84 import net.sf.jasperreports.engine.JRTextElement;
85 import net.sf.jasperreports.engine.JRTextField;
86 import net.sf.jasperreports.engine.JasperCompileManager;
87 import net.sf.jasperreports.engine.base.JRBaseBox;
88 import net.sf.jasperreports.engine.design.JRDesignFrame;
89 import net.sf.jasperreports.engine.design.JasperDesign;
90 import net.sf.jasperreports.engine.export.TextRenderer;
91 import net.sf.jasperreports.engine.fill.TextMeasurer;
92 import net.sf.jasperreports.engine.util.JRFontUtil;
93 import net.sf.jasperreports.engine.util.JRGraphEnvInitializer;
94 import net.sf.jasperreports.engine.util.JRImageLoader;
95 import net.sf.jasperreports.engine.util.JRLoader;
96 import net.sf.jasperreports.engine.util.JRStyledText;
97 import net.sf.jasperreports.engine.util.JRStyledTextParser;
98 import net.sf.jasperreports.engine.xml.JRXmlLoader;
99
100 import org.xml.sax.SAXException JavaDoc;
101
102
103 /**
104  * @author Teodor Danciu (teodord@users.sourceforge.net)
105  * @version $Id: JRDesignViewer.java 1507 2006-11-27 17:12:17 +0200 (Mon, 27 Nov 2006) teodord $
106  */

107 public class JRDesignViewer extends javax.swing.JPanel JavaDoc
108 {
109
110
111     /**
112      *
113      */

114     private static final int TYPE_FILE_NAME = 1;
115     private static final int TYPE_INPUT_STREAM = 2;
116     private static final int TYPE_JASPER_DESIGN = 3;
117
118     private static final int zooms[] = {50, 75, 100, 125, 150, 175, 200, 250};
119
120     private int type = TYPE_FILE_NAME;
121     private boolean isXML = false;
122     private String JavaDoc reportFileName = null;
123     private JRReport report = null;
124     private float zoom = 1f;
125     
126     /**
127      * the screen resolution.
128      */

129     private int screenResolution = JRViewer.REPORT_RESOLUTION;
130     
131     /**
132      * the zoom ration adjusted to the screen resolution.
133      */

134     private float realZoom = 0f;
135
136     private int offsetY = 0;
137     private int upColumns = 0;
138     private int downColumns = 0;
139
140     private int downX = 0;
141     private int downY = 0;
142
143     protected JRStyledTextParser styledTextParser = new JRStyledTextParser();
144     protected TextRenderer textRenderer = TextRenderer.getInstance();
145
146     
147     /** Creates new form JRDesignViewer */
148     public JRDesignViewer(String JavaDoc fileName, boolean isXML) throws JRException
149     {
150         JRGraphEnvInitializer.initializeGraphEnv();
151
152         setScreenDetails();
153
154         initComponents();
155
156         this.loadReport(fileName, isXML);
157         this.cmbZoom.setSelectedIndex(2);//100%
158
}
159
160     
161     /** Creates new form JRDesignViewer */
162     public JRDesignViewer(InputStream JavaDoc is, boolean isXML) throws JRException
163     {
164         JRGraphEnvInitializer.initializeGraphEnv();
165
166         setScreenDetails();
167         
168         initComponents();
169
170         this.loadReport(is, isXML);
171         this.cmbZoom.setSelectedIndex(2);//100%
172
}
173
174     
175     /** Creates new form JRDesignViewer */
176     public JRDesignViewer(JRReport report) throws JRException
177     {
178         JRGraphEnvInitializer.initializeGraphEnv();
179
180         setScreenDetails();
181
182         initComponents();
183
184         this.loadReport(report);
185         this.cmbZoom.setSelectedIndex(2);//100%
186
}
187
188     
189     private void setScreenDetails()
190     {
191         screenResolution = Toolkit.getDefaultToolkit().getScreenResolution();
192         setZoom(1f);
193     }
194
195     
196     /** This method is called from within the constructor to
197      * initialize the form.
198      * WARNING: Do NOT modify this code. The content of this method is
199      * always regenerated by the Form Editor.
200      */

201     private void initComponents() {//GEN-BEGIN:initComponents
202
java.awt.GridBagConstraints JavaDoc gridBagConstraints;
203
204         tlbToolBar = new javax.swing.JPanel JavaDoc();
205         btnReload = new javax.swing.JButton JavaDoc();
206         pnlSep01 = new javax.swing.JPanel JavaDoc();
207         pnlSep02 = new javax.swing.JPanel JavaDoc();
208         btnZoomIn = new javax.swing.JButton JavaDoc();
209         btnZoomOut = new javax.swing.JButton JavaDoc();
210         cmbZoom = new javax.swing.JComboBox JavaDoc();
211         DefaultComboBoxModel JavaDoc model = new DefaultComboBoxModel JavaDoc();
212         for(int i = 0; i < zooms.length; i++)
213         {
214             model.addElement("" + zooms[i] + "%");
215         }
216         cmbZoom.setModel(model);
217
218         pnlMain = new javax.swing.JPanel JavaDoc();
219         scrollPane = new javax.swing.JScrollPane JavaDoc();
220         scrollPane.getHorizontalScrollBar().setUnitIncrement(5);
221         scrollPane.getVerticalScrollBar().setUnitIncrement(5);
222
223         pnlInScroll = new javax.swing.JPanel JavaDoc();
224         pnlPage = new javax.swing.JPanel JavaDoc();
225         jPanel4 = new javax.swing.JPanel JavaDoc();
226         jPanel5 = new javax.swing.JPanel JavaDoc();
227         jPanel6 = new javax.swing.JPanel JavaDoc();
228         jPanel7 = new javax.swing.JPanel JavaDoc();
229         jPanel8 = new javax.swing.JPanel JavaDoc();
230         jLabel1 = new javax.swing.JLabel JavaDoc();
231         jPanel9 = new javax.swing.JPanel JavaDoc();
232         lblPage = new javax.swing.JLabel JavaDoc();
233
234         setLayout(new java.awt.BorderLayout JavaDoc());
235
236         tlbToolBar.setLayout(new java.awt.FlowLayout JavaDoc(java.awt.FlowLayout.LEFT, 0, 2));
237
238         btnReload.setIcon(new javax.swing.ImageIcon JavaDoc(getClass().getResource("/net/sf/jasperreports/view/images/reload.GIF")));
239         btnReload.setText("Reload");
240         btnReload.setToolTipText("Reload Document");
241         btnReload.setMargin(new java.awt.Insets JavaDoc(2, 2, 2, 2));
242         btnReload.setMaximumSize(new java.awt.Dimension JavaDoc(80, 23));
243         btnReload.setMinimumSize(new java.awt.Dimension JavaDoc(80, 23));
244         btnReload.setPreferredSize(new java.awt.Dimension JavaDoc(80, 23));
245         btnReload.addActionListener(new java.awt.event.ActionListener JavaDoc() {
246             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
247                 btnReloadActionPerformed();
248             }
249         });
250
251         tlbToolBar.add(btnReload);
252
253         pnlSep01.setMaximumSize(new java.awt.Dimension JavaDoc(10, 10));
254         tlbToolBar.add(pnlSep01);
255
256         pnlSep02.setMaximumSize(new java.awt.Dimension JavaDoc(10, 10));
257         tlbToolBar.add(pnlSep02);
258
259         btnZoomIn.setIcon(new javax.swing.ImageIcon JavaDoc(getClass().getResource("/net/sf/jasperreports/view/images/zoomin.GIF")));
260         btnZoomIn.setToolTipText("Zoom In");
261         btnZoomIn.setMargin(new java.awt.Insets JavaDoc(2, 2, 2, 2));
262         btnZoomIn.setMaximumSize(new java.awt.Dimension JavaDoc(23, 23));
263         btnZoomIn.setMinimumSize(new java.awt.Dimension JavaDoc(23, 23));
264         btnZoomIn.setPreferredSize(new java.awt.Dimension JavaDoc(23, 23));
265         btnZoomIn.addActionListener(new java.awt.event.ActionListener JavaDoc() {
266             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
267                 btnZoomInActionPerformed();
268             }
269         });
270
271         tlbToolBar.add(btnZoomIn);
272
273         btnZoomOut.setIcon(new javax.swing.ImageIcon JavaDoc(getClass().getResource("/net/sf/jasperreports/view/images/zoomout.GIF")));
274         btnZoomOut.setToolTipText("Zoom Out");
275         btnZoomOut.setMargin(new java.awt.Insets JavaDoc(2, 2, 2, 2));
276         btnZoomOut.setMaximumSize(new java.awt.Dimension JavaDoc(23, 23));
277         btnZoomOut.setMinimumSize(new java.awt.Dimension JavaDoc(23, 23));
278         btnZoomOut.setPreferredSize(new java.awt.Dimension JavaDoc(23, 23));
279         btnZoomOut.addActionListener(new java.awt.event.ActionListener JavaDoc() {
280             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
281                 btnZoomOutActionPerformed();
282             }
283         });
284
285         tlbToolBar.add(btnZoomOut);
286
287         cmbZoom.setToolTipText("Zoom Ratio");
288         cmbZoom.setMaximumSize(new java.awt.Dimension JavaDoc(80, 23));
289         cmbZoom.setMinimumSize(new java.awt.Dimension JavaDoc(80, 23));
290         cmbZoom.setPreferredSize(new java.awt.Dimension JavaDoc(80, 23));
291         cmbZoom.addActionListener(new java.awt.event.ActionListener JavaDoc() {
292             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
293                 cmbZoomActionPerformed();
294             }
295         });
296
297         tlbToolBar.add(cmbZoom);
298
299         add(tlbToolBar, java.awt.BorderLayout.NORTH);
300
301         pnlMain.setLayout(new java.awt.BorderLayout JavaDoc());
302
303         pnlInScroll.setLayout(new java.awt.GridBagLayout JavaDoc());
304
305         pnlPage.setLayout(new java.awt.BorderLayout JavaDoc());
306
307         pnlPage.setMinimumSize(new java.awt.Dimension JavaDoc(100, 100));
308         pnlPage.setPreferredSize(new java.awt.Dimension JavaDoc(100, 100));
309         jPanel4.setLayout(new java.awt.GridBagLayout JavaDoc());
310
311         jPanel4.setMinimumSize(new java.awt.Dimension JavaDoc(100, 120));
312         jPanel4.setPreferredSize(new java.awt.Dimension JavaDoc(100, 120));
313         jPanel5.setBackground(java.awt.Color.gray);
314         jPanel5.setMinimumSize(new java.awt.Dimension JavaDoc(5, 5));
315         jPanel5.setPreferredSize(new java.awt.Dimension JavaDoc(5, 5));
316         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
317         gridBagConstraints.gridx = 2;
318         gridBagConstraints.gridy = 1;
319         gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
320         jPanel4.add(jPanel5, gridBagConstraints);
321
322         jPanel6.setMinimumSize(new java.awt.Dimension JavaDoc(5, 5));
323         jPanel6.setPreferredSize(new java.awt.Dimension JavaDoc(5, 5));
324         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
325         gridBagConstraints.gridx = 0;
326         gridBagConstraints.gridy = 2;
327         jPanel4.add(jPanel6, gridBagConstraints);
328
329         jPanel7.setBackground(java.awt.Color.gray);
330         jPanel7.setMinimumSize(new java.awt.Dimension JavaDoc(5, 5));
331         jPanel7.setPreferredSize(new java.awt.Dimension JavaDoc(5, 5));
332         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
333         gridBagConstraints.gridx = 1;
334         gridBagConstraints.gridy = 2;
335         gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
336         jPanel4.add(jPanel7, gridBagConstraints);
337
338         jPanel8.setBackground(java.awt.Color.gray);
339         jPanel8.setMinimumSize(new java.awt.Dimension JavaDoc(5, 5));
340         jPanel8.setPreferredSize(new java.awt.Dimension JavaDoc(5, 5));
341         jLabel1.setText("jLabel1");
342         jPanel8.add(jLabel1);
343
344         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
345         gridBagConstraints.gridx = 2;
346         gridBagConstraints.gridy = 2;
347         jPanel4.add(jPanel8, gridBagConstraints);
348
349         jPanel9.setMinimumSize(new java.awt.Dimension JavaDoc(5, 5));
350         jPanel9.setPreferredSize(new java.awt.Dimension JavaDoc(5, 5));
351         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
352         gridBagConstraints.gridx = 2;
353         gridBagConstraints.gridy = 0;
354         jPanel4.add(jPanel9, gridBagConstraints);
355
356         lblPage.setBackground(java.awt.Color.white);
357         lblPage.setBorder(new javax.swing.border.LineBorder JavaDoc(new java.awt.Color JavaDoc(0, 0, 0)));
358         lblPage.setOpaque(true);
359         lblPage.addMouseListener(new java.awt.event.MouseAdapter JavaDoc() {
360             public void mousePressed(java.awt.event.MouseEvent JavaDoc evt) {
361                 lblPageMousePressed(evt);
362             }
363             public void mouseReleased(java.awt.event.MouseEvent JavaDoc evt) {
364                 lblPageMouseReleased();
365             }
366         });
367
368         lblPage.addMouseMotionListener(new java.awt.event.MouseMotionAdapter JavaDoc() {
369             public void mouseDragged(java.awt.event.MouseEvent JavaDoc evt) {
370                 lblPageMouseDragged(evt);
371             }
372         });
373
374         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
375         gridBagConstraints.gridx = 0;
376         gridBagConstraints.gridy = 0;
377         gridBagConstraints.gridwidth = 2;
378         gridBagConstraints.gridheight = 2;
379         gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
380         gridBagConstraints.weightx = 1.0;
381         gridBagConstraints.weighty = 1.0;
382         jPanel4.add(lblPage, gridBagConstraints);
383
384         pnlPage.add(jPanel4, java.awt.BorderLayout.CENTER);
385
386         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
387         gridBagConstraints.insets = new java.awt.Insets JavaDoc(5, 5, 5, 5);
388         pnlInScroll.add(pnlPage, gridBagConstraints);
389
390         scrollPane.setViewportView(pnlInScroll);
391
392         pnlMain.add(scrollPane, java.awt.BorderLayout.CENTER);
393
394         add(pnlMain, java.awt.BorderLayout.CENTER);
395
396     }//GEN-END:initComponents
397

398     void btnReloadActionPerformed()//GEN-FIRST:event_btnReloadActionPerformed
399
{//GEN-HEADEREND:event_btnReloadActionPerformed
400
// Add your handling code here:
401
if (this.type == TYPE_FILE_NAME)
402         {
403             try
404             {
405                 this.loadReport(this.reportFileName, this.isXML);
406                 //this.cmbZoom.setSelectedIndex(2);//100%
407
this.refreshDesign();
408             }
409             catch (JRException e)
410             {
411                 e.printStackTrace();
412                 JOptionPane.showMessageDialog(this, "Error loading report design. See console for details.");
413             }
414         }
415     }//GEN-LAST:event_btnReloadActionPerformed
416

417     void btnZoomInActionPerformed()//GEN-FIRST:event_btnZoomInActionPerformed
418
{//GEN-HEADEREND:event_btnZoomInActionPerformed
419
// Add your handling code here:
420
int index = this.cmbZoom.getSelectedIndex();
421         if (index < this.cmbZoom.getModel().getSize() - 1)
422         {
423             this.cmbZoom.setSelectedIndex(index + 1);
424         }
425     }//GEN-LAST:event_btnZoomInActionPerformed
426

427     void btnZoomOutActionPerformed()//GEN-FIRST:event_btnZoomOutActionPerformed
428
{//GEN-HEADEREND:event_btnZoomOutActionPerformed
429
// Add your handling code here:
430
int index = this.cmbZoom.getSelectedIndex();
431         if (index > 0)
432         {
433             this.cmbZoom.setSelectedIndex(index - 1);
434         }
435     }//GEN-LAST:event_btnZoomOutActionPerformed
436

437     void lblPageMousePressed(java.awt.event.MouseEvent JavaDoc evt)//GEN-FIRST:event_lblPageMousePressed
438
{//GEN-HEADEREND:event_lblPageMousePressed
439
// Add your handling code here:
440
this.lblPage.setCursor(new Cursor JavaDoc(Cursor.MOVE_CURSOR));
441
442         this.downX = evt.getX();
443         this.downY = evt.getY();
444     }//GEN-LAST:event_lblPageMousePressed
445

446     void lblPageMouseReleased()//GEN-FIRST:event_lblPageMouseReleased
447
{//GEN-HEADEREND:event_lblPageMouseReleased
448
// Add your handling code here:
449
this.lblPage.setCursor(new Cursor JavaDoc(Cursor.DEFAULT_CURSOR));
450     }//GEN-LAST:event_lblPageMouseReleased
451

452     void lblPageMouseDragged(java.awt.event.MouseEvent JavaDoc evt)//GEN-FIRST:event_lblPageMouseDragged
453
{//GEN-HEADEREND:event_lblPageMouseDragged
454
// Add your handling code here:
455
Container JavaDoc container = pnlInScroll.getParent();
456         if (container instanceof JViewport JavaDoc)
457         {
458             JViewport JavaDoc viewport = (JViewport JavaDoc) container;
459             Point JavaDoc point = viewport.getViewPosition();
460             int newX = point.x - (evt.getX() - downX);
461             int newY = point.y - (evt.getY() - downY);
462             
463             int maxX = pnlInScroll.getWidth() - viewport.getWidth();
464             int maxY = pnlInScroll.getHeight() - viewport.getHeight();
465
466             if (newX < 0)
467             {
468                 newX = 0;
469             }
470             if (newX > maxX)
471             {
472                 newX = maxX;
473             }
474             if (newY < 0)
475             {
476                 newY = 0;
477             }
478             if (newY > maxY)
479             {
480                 newY = maxY;
481             }
482             
483             viewport.setViewPosition(new Point JavaDoc(newX, newY));
484         }
485     }//GEN-LAST:event_lblPageMouseDragged
486

487     void cmbZoomActionPerformed()//GEN-FIRST:event_cmbZoomActionPerformed
488
{//GEN-HEADEREND:event_cmbZoomActionPerformed
489
// Add your handling code here:
490
int index = this.cmbZoom.getSelectedIndex();
491         setZoom(zooms[index] / 100f);
492         this.btnZoomIn.setEnabled( (index < this.cmbZoom.getModel().getSize() - 1) );
493         this.btnZoomOut.setEnabled( (index > 0) );
494         this.refreshDesign();
495     }//GEN-LAST:event_cmbZoomActionPerformed
496

497
498     private void setZoom(float zoom)
499     {
500         this.zoom = zoom;
501         this.realZoom = this.zoom * screenResolution / JRViewer.REPORT_RESOLUTION;
502     }
503
504
505     /**
506     */

507     private void verifyDesign(JasperDesign jasperDesign) throws JRException
508     {
509         /* */
510         Collection JavaDoc brokenRules = JasperCompileManager.verifyDesign(jasperDesign);
511         if (brokenRules != null && brokenRules.size() > 0)
512         {
513             StringBuffer JavaDoc sbuffer = new StringBuffer JavaDoc();
514             sbuffer.append("Report definition not valid : ");
515             int i = 1;
516             for(Iterator JavaDoc it = brokenRules.iterator(); it.hasNext(); i++)
517             {
518                 sbuffer.append("\n\t " + i + ". " + (String JavaDoc)it.next());
519             }
520             
521             throw new JRException(sbuffer.toString());
522         }
523     }
524
525
526     /**
527     */

528     private void loadReport(String JavaDoc fileName, boolean isXmlReport) throws JRException
529     {
530         if (isXmlReport)
531         {
532             JasperDesign jasperDesign = JRXmlLoader.load(fileName);
533             setReport(jasperDesign);
534         }
535         else
536         {
537             setReport((JRReport) JRLoader.loadObject(fileName));
538         }
539         this.type = TYPE_FILE_NAME;
540         this.isXML = isXmlReport;
541         this.reportFileName = fileName;
542         this.setOffsetY();
543         this.btnReload.setEnabled(true);
544     }
545
546
547     /**
548     */

549     private void loadReport(InputStream JavaDoc is, boolean isXmlReport) throws JRException
550     {
551         if (isXmlReport)
552         {
553             JasperDesign jasperDesign = JRXmlLoader.load(is);
554             setReport(jasperDesign);
555         }
556         else
557         {
558             setReport((JRReport) JRLoader.loadObject(is));
559         }
560         this.type = TYPE_INPUT_STREAM;
561         this.isXML = isXmlReport;
562         this.setOffsetY();
563         this.btnReload.setEnabled(false);
564     }
565
566
567     /**
568     */

569     private void loadReport(JRReport rep) throws JRException
570     {
571         setReport(rep);
572         this.type = TYPE_JASPER_DESIGN;
573         this.isXML = false;
574         this.setOffsetY();
575         this.btnReload.setEnabled(false);
576     }
577     
578     private void setReport(JRReport report) throws JRException
579     {
580         if (report instanceof JasperDesign)
581         {
582             verifyDesign((JasperDesign) report);
583         }
584         
585         this.report = report;
586     }
587
588
589     /**
590     *
591     */

592     public void setOffsetY()
593     {
594         offsetY = report.getTopMargin();
595         offsetY += (report.getTitle() != null ? report.getTitle().getHeight() : 0);
596         offsetY += (report.getPageHeader() != null ? report.getPageHeader().getHeight() : 0);
597         upColumns = offsetY;
598         offsetY += (report.getColumnHeader() != null ? report.getColumnHeader().getHeight() : 0);
599
600         JRGroup group = null;
601         JRGroup[] groups = report.getGroups();
602         if (groups != null && groups.length > 0)
603         {
604             for(int i = 0; i < groups.length; i++)
605             {
606                 group = groups[i];
607
608                 offsetY += (group.getGroupHeader() != null ? group.getGroupHeader().getHeight() : 0);
609             }
610         }
611
612         offsetY += (report.getDetail() != null ? report.getDetail().getHeight() : 0);
613
614         if (groups != null && groups.length > 0)
615         {
616             for(int i = groups.length - 1; i >= 0; i--)
617             {
618                 group = groups[i];
619
620                 offsetY += (group.getGroupFooter() != null ? group.getGroupFooter().getHeight() : 0);
621             }
622         }
623
624         offsetY += (report.getColumnFooter() != null ? report.getColumnFooter().getHeight() : 0);
625         downColumns = offsetY;
626         offsetY += (report.getPageFooter() != null ? report.getPageFooter().getHeight() : 0);
627         offsetY += (report.getLastPageFooter() != null ? report.getLastPageFooter().getHeight() : 0);
628         offsetY += (report.getSummary() != null ? report.getSummary().getHeight() : 0);
629         offsetY += report.getBottomMargin();
630     }
631
632     
633     /**
634     */

635     private void refreshDesign()
636     {
637         Image JavaDoc image = null;
638         ImageIcon JavaDoc imageIcon = null;
639
640         Dimension JavaDoc dim = new Dimension JavaDoc(
641             (int)(report.getPageWidth() * realZoom) + 8, //why 8 ? 2 for the balck border, 1 extra for the image and 5 for the shadow panels
642
(int)(offsetY * realZoom) + 8
643             );
644         this.pnlPage.setMaximumSize(dim);
645         this.pnlPage.setMinimumSize(dim);
646         this.pnlPage.setPreferredSize(dim);
647
648         try
649         {
650             image = this.printDesignToImage();
651             imageIcon = new ImageIcon JavaDoc(image);
652         }
653         catch(Exception JavaDoc e)
654         {
655             e.printStackTrace();
656         }
657
658         this.lblPage.setIcon(imageIcon);
659     }
660
661
662     /**
663      */

664     private Image JavaDoc printDesignToImage()
665     {
666         Image JavaDoc designImage = new BufferedImage JavaDoc(
667             (int)(report.getPageWidth() * realZoom) + 1,
668             (int)(offsetY * realZoom) + 1,
669             BufferedImage.TYPE_INT_RGB
670             );
671         Graphics2D JavaDoc grx = (Graphics2D JavaDoc)designImage.getGraphics();
672
673         grx.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
674         grx.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
675         grx.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
676
677         AffineTransform JavaDoc atrans = new AffineTransform JavaDoc();
678         atrans.scale(realZoom, realZoom);
679         grx.transform(atrans);
680
681         printDesign(grx);
682
683         grx.dispose();
684         
685         return designImage;
686     }
687
688     
689     /**
690      */

691     private void printDesign(Graphics2D JavaDoc grx)
692     {
693         Stroke JavaDoc dashedStroke =
694             new BasicStroke JavaDoc(
695                 1f / realZoom,
696                 BasicStroke.CAP_BUTT,
697                 BasicStroke.JOIN_BEVEL,
698                 0f,
699                 new float[]{5f, 3f},
700                 0f
701                 );
702         Color JavaDoc dashedColor = new Color JavaDoc(170, 170, 255);
703
704         grx.setColor(Color.white);
705         grx.fillRect(
706             0,
707             0,
708             report.getPageWidth() + 1,
709             offsetY + 1
710             );
711
712         grx.setStroke(dashedStroke);
713         grx.setColor(dashedColor);
714         grx.drawLine(
715             report.getLeftMargin(),
716             0,
717             report.getLeftMargin(),
718             offsetY + 1
719             );
720         grx.drawLine(
721             (report.getPageWidth() - report.getRightMargin()),
722             0,
723             (report.getPageWidth() - report.getRightMargin()),
724             offsetY + 1
725             );
726         grx.drawLine(
727             (report.getLeftMargin() + report.getColumnWidth()),
728             upColumns,
729             (report.getLeftMargin() + report.getColumnWidth()),
730             downColumns
731             );
732         grx.drawLine(
733             (report.getLeftMargin() + report.getColumnWidth() + report.getColumnSpacing()),
734             upColumns,
735             (report.getLeftMargin() + report.getColumnWidth() + report.getColumnSpacing()),
736             downColumns
737             );
738
739
740         grx.translate(
741             report.getLeftMargin(),
742             report.getTopMargin()
743             );
744
745         grx.setStroke(dashedStroke);
746         grx.setColor(dashedColor);
747         grx.drawLine(
748        &nb