1
28 package demo.view.isometry;
29
30 import y.geom.YRectangle;
31 import y.view.DefaultLabelConfiguration;
32 import y.view.LineType;
33 import y.view.YLabel;
34
35 import java.awt.Color;
36 import java.awt.Font;
37 import java.awt.Graphics2D;
38 import java.awt.Insets;
39 import java.awt.Stroke;
40 import java.awt.font.FontRenderContext;
41 import java.awt.font.TextLayout;
42 import java.awt.geom.AffineTransform;
43 import java.awt.geom.GeneralPath;
44 import java.awt.geom.Rectangle2D;
45
46
49 public class EdgeLabelConfiguration extends DefaultLabelConfiguration {
50
51
54 public void paintBox(YLabel label, Graphics2D gfx, double x, double y, double width, double height) {
55 final Stroke oldStroke = gfx.getStroke();
56 final Color oldColor = gfx.getColor();
57
58 final IsometryData isometryData = (IsometryData) label.getUserData();
61 final double[] corners = new double[16];
62 isometryData.calculateCorners(corners);
63 IsometryData.moveTo(x, y, corners);
64
65 if (isHorizontal(label)) {
68 gfx.setStroke(LineType.LINE_1);
69 final GeneralPath path = new GeneralPath();
70 if (label.getLineColor() != null) {
71 gfx.setColor(label.getLineColor());
72 path.moveTo((float) corners[IsometryData.C0_X], (float) corners[IsometryData.C0_Y]);
73 path.lineTo((float) corners[IsometryData.C1_X], (float) corners[IsometryData.C1_Y]);
74 path.lineTo((float) corners[IsometryData.C5_X], (float) corners[IsometryData.C5_Y]);
75 path.lineTo((float) corners[IsometryData.C4_X], (float) corners[IsometryData.C4_Y]);
76 path.closePath();
77 gfx.draw(path);
78 }
79 if (label.getBackgroundColor() != null) {
80 gfx.setColor(label.getBackgroundColor());
81 gfx.fill(path);
82 }
83 } else {
84 gfx.setStroke(LineType.LINE_1);
85 final GeneralPath path = new GeneralPath();
86 if (label.getLineColor() != null) {
87 gfx.setColor(label.getLineColor());
88 path.moveTo((float) corners[IsometryData.C2_X], (float) corners[IsometryData.C2_Y]);
89 path.lineTo((float) corners[IsometryData.C1_X], (float) corners[IsometryData.C1_Y]);
90 path.lineTo((float) corners[IsometryData.C5_X], (float) corners[IsometryData.C5_Y]);
91 path.lineTo((float) corners[IsometryData.C6_X], (float) corners[IsometryData.C6_Y]);
92 path.closePath();
93 gfx.draw(path);
94 }
95 if (label.getBackgroundColor() != null) {
96 gfx.setColor(label.getBackgroundColor());
97 gfx.fill(path);
98 }
99 }
100
101 gfx.setStroke(oldStroke);
102 gfx.setColor(oldColor);
103 }
104
105
108 public void paintContent(YLabel label, Graphics2D gfx, double x, double y, double width, double height) {
109 final AffineTransform oldTransform = gfx.getTransform();
110 final Font oldFont = gfx.getFont();
111 final Color oldColor = gfx.getColor();
112
113 final IsometryData isometryData = (IsometryData) label.getUserData();
115 final double[] corners = new double[16];
116 isometryData.calculateCorners(corners);
117 IsometryData.moveTo(x, y, corners);
118 final double anchorX;
119 final double anchorY;
120 if (isHorizontal(label)) {
121 anchorX = corners[IsometryData.C0_X];
122 anchorY = corners[IsometryData.C0_Y];
123
124 gfx.translate(anchorX, anchorY);
126 gfx.transform(new AffineTransform(new double[]{0.87, -0.5, 0, 1}));
127 gfx.translate(-anchorX, -anchorY);
128 } else {
129 anchorX = corners[IsometryData.C1_X];
130 anchorY = corners[IsometryData.C1_Y];
131
132 gfx.translate(anchorX, anchorY);
134 gfx.transform(new AffineTransform(new double[]{0.87, 0.5, 0, 1}));
135 gfx.translate(-anchorX, -anchorY);
136 }
137
138 if (label.getTextColor() != null && !"".equals(label.getText())) {
140 final Insets insets = label.getInsets() == null ? YLabel.defaultInsets : label.getInsets();
141 final float descent = new TextLayout(label.getText(), label.getFont(), gfx.getFontRenderContext()).getDescent();
142 gfx.setFont(label.getFont());
143 gfx.setColor(label.getTextColor());
144 gfx.drawString(label.getText(), (float) anchorX + insets.left, (float) anchorY - insets.bottom - descent);
145 }
146
147 gfx.setTransform(oldTransform);
148 gfx.setFont(oldFont);
149 gfx.setColor(oldColor);
150 }
151
152
160 public void calcUnionRect(final YLabel label, final Rectangle2D rectangle) {
161 final IsometryData isometryData = (IsometryData) label.getUserData();
162 final double[] corners = new double[16];
163 isometryData.calculateCorners(corners);
164 final YRectangle box = label.getBox();
165 IsometryData.moveTo(box.getX(), box.getY(), corners);
166 IsometryData.calculateViewBounds(corners, rectangle);
167 }
168
169
177 public void calculateContentSize(YLabel label, FontRenderContext frc) {
178 IsometryData isometryData = (IsometryData) label.getUserData();
179 final Rectangle2D.Double bounds = new Rectangle2D.Double(0, 0, -1, -1);
180 isometryData.calculateViewBounds(bounds);
181 label.setContentSize(bounds.getWidth(), bounds.getHeight());
182 }
183
184
192 public boolean contains(YLabel label, double x, double y) {
193 final Rectangle2D.Double rectangle = new Rectangle2D.Double(0, 0, -1, -1);
194 calcUnionRect(label, rectangle);
195 return rectangle.contains(x, y);
196 }
197
198
201 private boolean isHorizontal(YLabel label) {
202 final Object userData = label.getUserData();
203 return !(userData instanceof IsometryData) || ((IsometryData) userData).isHorizontal();
204 }
205 }
206