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