JAL-3032 adds Java 8 functionality (2/2)
[jalview.git] / src2 / fr / orsay / lri / varna / models / export / SwingGraphics.java
1 package fr.orsay.lri.varna.models.export;
2
3 import java.awt.BasicStroke;
4 import java.awt.Color;
5 import java.awt.Dimension;
6 import java.awt.Font;
7 import java.awt.FontMetrics;
8 import java.awt.Graphics2D;
9 import java.awt.Shape;
10 import java.awt.Stroke;
11 import java.awt.geom.Arc2D.Double;
12 import java.awt.geom.Ellipse2D;
13 import java.awt.geom.GeneralPath;
14 import java.awt.geom.Rectangle2D;
15
16 public class SwingGraphics implements VueVARNAGraphics {
17         private BasicStroke _dashedStroke;
18         private BasicStroke _plainStroke;
19         Graphics2D _g2d;
20         private boolean _debug = false;
21
22         
23         public SwingGraphics(Graphics2D g2d)
24         {
25                 _g2d = g2d;
26                 float[] dash = { 5.0f, 5.0f };
27                 _dashedStroke = new BasicStroke(1.0f, BasicStroke.CAP_ROUND,    BasicStroke.JOIN_ROUND, 3.0f, dash, 0);
28                 _plainStroke = new BasicStroke(1.0f, BasicStroke.CAP_ROUND,     BasicStroke.JOIN_ROUND, 3.0f);
29         }
30         
31         public Dimension getStringDimension(String s) {
32                 FontMetrics fm = _g2d.getFontMetrics();
33                 Rectangle2D r = fm.getStringBounds(s, _g2d);
34                 return (new Dimension((int) r.getWidth(), (int) fm.getAscent()
35                                 - fm.getDescent()));
36         }
37
38         public void drawStringCentered(String res, double x,
39                         double y) {
40                 Dimension d = getStringDimension(res);
41                 x -= (double) d.width / 2.0;
42                 y += (double) d.height / 2.0;
43                 if (_debug)
44                 {
45                     Stroke bck = _g2d.getStroke();
46                     _g2d.setStroke(_plainStroke);
47                     _g2d.draw(new Rectangle2D.Double(x, y - d.height, d.width, d.height));
48                     _g2d.setStroke(bck);
49                 }
50                 _g2d.drawString(res, (float) (x), (float) (y));
51         }
52
53         public void draw(GeneralPath s) {
54                 _g2d.draw(s);
55         }
56
57         public void drawArc(double x, double y, double rx, double ry,
58                         double angleStart, double angleEnd) {
59                 _g2d.drawArc((int) (x-rx/2.), (int) (y-ry/2.), (int) rx, (int) ry, (int) angleStart, (int) angleEnd);   
60         }
61
62         public void drawLine(double x1, double y1, double x2, double y2) {
63                 _g2d.drawLine((int)x1, (int)y1, (int)x2, (int)y2);
64         }
65
66         public void drawCircle(double x, double y, double r) {
67                 _g2d.draw(new Ellipse2D.Double(x, y, r, r));
68         }
69
70         public void drawRect(double x, double y, double w, double h) {
71                 _g2d.drawRect((int)x, (int)y, (int)w, (int)h);
72         }
73
74         public void drawRoundRect(double x, double y, double w, double h,
75                         double rx, double ry) {
76                 _g2d.drawRoundRect((int)x, (int)y, (int)w, (int)h, (int)rx, (int)ry);
77         }
78
79         public void drawString(String s, double x, double y) {
80                 _g2d.drawString(s, (float)x, (float)y);
81         }
82
83         public void fill(GeneralPath s) {
84                 _g2d.fill(s);
85         }
86
87         public void fillCircle(double x, double y, double r) {
88                 _g2d.fill(new Ellipse2D.Double(x, y, r, r));
89         }
90
91         public void fillRect(double x, double y, double w, double h) {
92                 _g2d.fill(new Rectangle2D.Double(x, y, w, h));
93         }
94
95         public void fillRoundRect(double x, double y, double w, double h,
96                         double rx, double ry) {
97                 _g2d.fillRoundRect((int)x, (int)y, (int)w, (int)h, (int)rx, (int)ry);
98         }
99
100         public Color getColor() {
101                 return _g2d.getColor();
102         }
103
104         public void setColor(Color c) {
105                 _g2d.setColor(c);
106         }
107
108         public void setSelectionStroke() {
109                 _g2d.setStroke(_dashedStroke);
110         }
111
112         public void setFont(Font f) {
113                 _g2d.setFont(f);
114         }
115
116         public void setPlainStroke() {
117                 _g2d.setStroke(_plainStroke);
118         }
119         
120         private BasicStroke deriveStroke(BasicStroke s, double t)
121         {
122                 return new BasicStroke((float)t, s.getEndCap(), s.getLineJoin(), s.getMiterLimit(), s.getDashArray(), s.getDashPhase()) ;
123         }
124
125         public void setStrokeThickness(double t) {
126                 boolean dashed = (_g2d.getStroke()==_dashedStroke); 
127                 _plainStroke = deriveStroke(_plainStroke, t);
128                 //_dashedStroke = deriveStroke(_dashedStroke, t);
129                 if(dashed)
130                 {  _g2d.setStroke(_dashedStroke); }
131                 else
132                 { _g2d.setStroke(_plainStroke); }
133         }
134
135 }