View Javadoc

1   // Copyright 2007 FreeHEP
2   package org.freehep.graphicsio.emf;
3   
4   import javax.swing.JComponent;
5   import java.awt.Color;
6   import java.awt.Dimension;
7   import java.awt.Graphics;
8   import java.awt.Graphics2D;
9   import java.awt.geom.AffineTransform;
10  
11  /**
12   * simple panel which displays an EMF image using the {@link EMFRenderer}
13   *
14   * @author Steffen Greiffenberg
15   * @version $id$
16   */
17  public class EMFPanel extends JComponent {
18  
19      /**
20       * factor used for zoom in an out
21       */
22      private static double SCALE_FACTOR = 2;
23  
24      /**
25       * renders an EMF image to a Graphics2D instance
26       */
27      private EMFRenderer renderer;
28  
29      /**
30       * used for zooming
31       */
32      private double scale = 1;
33  
34      /**
35       * defines a white background
36       */
37      public EMFPanel() {
38          setBackground(Color.white);
39      }
40  
41      /**
42       * sets the renderer an resets size
43       * @param renderer EMFRenderer to display
44       */
45      public void setRenderer(EMFRenderer renderer) {
46          this.renderer = renderer;
47          scale = 1;
48          setSize(getPreferredSize());
49      }
50  
51      /**
52       * @return {@link EMFRenderer#getSize()} for the renderer
53       */
54      public Dimension getPreferredSize() {
55          if (renderer == null) {
56              return new Dimension(0, 0);
57          }
58  
59          Dimension bounds = renderer.getSize();
60          return new Dimension(
61              (int)Math.ceil(bounds.width * scale),
62              (int)Math.ceil(bounds.height * scale));
63      }
64  
65      /**
66       * paints using the renderer
67       * @param g Context of the component
68       */
69      public void paintComponent(Graphics g) {
70          Graphics2D g2 = ((Graphics2D)g);
71          super.paintComponent(g2);
72  
73          if (renderer == null) {
74              return;
75          }
76  
77          // to restore AffineTransform
78          AffineTransform at = g2.getTransform();
79  
80          // apply the scale factor
81          g2.scale(scale, scale);
82  
83          // render the emf
84          renderer.paint(g2);
85  
86          // rest the AffineTransform
87          g2.setTransform(at);
88      }
89  
90      /**
91       * scale = scale * 2
92       */
93      public void zoomIn() {
94          scale = scale * SCALE_FACTOR;
95          setSize(getPreferredSize());
96          repaint();
97      }
98  
99      /**
100      * scale = scale / 2;
101      */
102     public void zoomOut() {
103         scale = scale / SCALE_FACTOR;
104         setSize(getPreferredSize());
105         repaint();
106     }
107 }