Source code: com/port80/graph/impl/GraphPanel.java
1 //
2 // Copyright(c) 2002, Chris Leung
3 //
4
5 package com.port80.graph.impl;
6
7 import java.awt.*;
8 import java.awt.geom.*;
9 import java.awt.image.*;
10 import java.awt.font.*;
11 import java.util.*;
12 import javax.swing.*;
13 import com.port80.util.*;
14 import com.port80.graph.*;
15
16 /** Graph panel class.
17 */
18 public class GraphPanel extends JPanel {
19
20 // Static fields ///////////////////////////////////////////////////////
21 //
22 private static final String NAME = "GraphPanel";
23
24 // Instance fields /////////////////////////////////////////////////////
25 //
26
27 IGraph graph = null;
28 Graphics2D graphics2d = null;
29 IGraphRenderer renderer = null;
30 boolean dirty;
31 BufferedImage imageBuffer;
32 double scale = 1.0;
33
34 // Constructors ////////////////////////////////////////////////////////
35 //
36
37 public GraphPanel() {}
38 public GraphPanel(IGraph g) {
39 super();
40 setGraph(g);
41 dirty = true;
42 }
43 public GraphPanel(IGraph g, double scale) {
44 super();
45 this.scale = scale;
46 setGraph(g);
47 dirty = true;
48 }
49
50 // IGraphPanel interface ///////////////////////////////////////////////
51 //
52
53 public void setGraph(IGraph g) {
54 graph = g;
55 renderer = GraphRendererFactory.getInstance(g);
56 setScale(this.scale);
57 newImageBuffer();
58 }
59 public void setScale(double scale) {
60 this.scale = scale;
61 renderer.setScale(scale);
62 }
63 public void paintComponent(Graphics g) {
64 if (dirty) updateBuffer();
65 Rectangle r = g.getClipBounds();
66 g.clearRect((int)r.getX(), (int)r.getY(), (int)r.getWidth(), (int)r.getHeight());
67 ((Graphics2D)g).drawImage(imageBuffer, new AffineTransform(1f, 0f, 0f, 1f, 0f, 0f), null);
68 }
69
70 public Graphics2D getGraphics2D() {
71 return graphics2d;
72 }
73 public IGraphRenderer getRenderer() {
74 return renderer;
75 }
76 public BufferedImage getImage() {
77 if (dirty) updateBuffer();
78 return imageBuffer;
79 }
80
81 ////////////////////////////////////////////////////////////////////////
82
83 private void newImageBuffer() {
84 Rectangle2D bb = (Rectangle2D)graph.getAttr("bb");
85 double sc = (scale > 0) ? scale : 1.0;
86 int width = (int)(bb.getWidth() * sc) + 1;
87 int height = (int)(bb.getHeight() * sc) + 1;
88 if (bb != null)
89 setPreferredSize(new Dimension(width, height));
90 else
91 setPreferredSize(new Dimension(500, 500));
92 imageBuffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
93 }
94 private void updateBuffer() {
95 Graphics2D g2d = (Graphics2D)imageBuffer.getGraphics();
96 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
97 g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
98 g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
99 g2d.setColor(Color.white);
100 g2d.fillRect(0, 0, imageBuffer.getWidth(), imageBuffer.getHeight());
101 renderer.render(g2d, graph);
102 dirty = false;
103 }
104
105 ////////////////////////////////////////////////////////////////////////
106
107 }
108