1   
28  package demo.view.isometry;
29  
30  import y.view.AbstractCustomNodePainter;
31  import y.view.GenericNodeRealizer;
32  import y.view.NodeRealizer;
33  
34  import java.awt.Color;
35  import java.awt.Graphics2D;
36  import java.awt.Shape;
37  import java.awt.geom.GeneralPath;
38  import java.awt.geom.Line2D;
39  
40  
43  class IsometryNodePainter extends AbstractCustomNodePainter implements GenericNodeRealizer.ContainsTest {
44  
45    protected void paintNode(final NodeRealizer context, final Graphics2D graphics, final boolean sloppy) {
46      final IsometryData data = (IsometryData) ((GenericNodeRealizer) context).getUserData();
47      final double[] corners = new double[16];
48      calculateCorners(context, corners);
49  
50          if (initializeFill(context, graphics)) {
52        final GeneralPath path = new GeneralPath();
53        path.moveTo((float) corners[IsometryData.C4_X], (float) corners[IsometryData.C4_Y]);
54        path.lineTo((float) corners[IsometryData.C5_X], (float) corners[IsometryData.C5_Y]);
55        path.lineTo((float) corners[IsometryData.C6_X], (float) corners[IsometryData.C6_Y]);
56        path.lineTo((float) corners[IsometryData.C7_X], (float) corners[IsometryData.C7_Y]);
57        path.closePath();
58        graphics.fill(path);
59        path.reset();
60  
61        if (data.getHeight() > 0) {
62          path.moveTo((float) corners[IsometryData.C0_X], (float) corners[IsometryData.C0_Y]);
63          path.lineTo((float) corners[IsometryData.C4_X], (float) corners[IsometryData.C4_Y]);
64          path.lineTo((float) corners[IsometryData.C7_X], (float) corners[IsometryData.C7_Y]);
65          path.lineTo((float) corners[IsometryData.C3_X], (float) corners[IsometryData.C3_Y]);
66          path.closePath();
67          Color color = getFillColor(context, false).darker();
68          graphics.setColor(color);
69          graphics.fill(path);
70          path.reset();
71  
72          path.moveTo((float) corners[IsometryData.C3_X], (float) corners[IsometryData.C3_Y]);
73          path.lineTo((float) corners[IsometryData.C7_X], (float) corners[IsometryData.C7_Y]);
74          path.lineTo((float) corners[IsometryData.C6_X], (float) corners[IsometryData.C6_Y]);
75          path.lineTo((float) corners[IsometryData.C2_X], (float) corners[IsometryData.C2_Y]);
76          path.closePath();
77          graphics.setColor(color.darker());
78          graphics.fill(path);
79        }
80      }
81  
82          if (initializeLine(context, graphics)) {
84        final Shape outline = createOutline(corners);
85        graphics.draw(outline);
86        if (data.getHeight() > 0) {
87          final Line2D line = new Line2D.Double();
88          line.setLine(corners[IsometryData.C7_X], corners[IsometryData.C7_Y],
89              corners[IsometryData.C4_X], corners[IsometryData.C4_Y]);
90          graphics.draw(line);
91          line.setLine(corners[IsometryData.C7_X], corners[IsometryData.C7_Y],
92              corners[IsometryData.C3_X], corners[IsometryData.C3_Y]);
93          graphics.draw(line);
94          line.setLine(corners[IsometryData.C7_X], corners[IsometryData.C7_Y],
95              corners[IsometryData.C6_X], corners[IsometryData.C6_Y]);
96          graphics.draw(line);
97        }
98      }
99    }
100 
101   public boolean contains(final NodeRealizer context, final double x, final double y) {
102     final double[] corners = new double[16];
103     calculateCorners(context, corners);
104     final Shape outline = createOutline(corners);
105     return outline.contains(x, y);
106   }
107 
108   
113   private Shape createOutline(final double[] corners) {
114     final GeneralPath outline = new GeneralPath();
115     outline.moveTo((float) corners[IsometryData.C0_X], (float) corners[IsometryData.C0_Y]);
116     outline.lineTo((float) corners[IsometryData.C3_X], (float) corners[IsometryData.C3_Y]);
117     outline.lineTo((float) corners[IsometryData.C2_X], (float) corners[IsometryData.C2_Y]);
118     outline.lineTo((float) corners[IsometryData.C6_X], (float) corners[IsometryData.C6_Y]);
119     outline.lineTo((float) corners[IsometryData.C5_X], (float) corners[IsometryData.C5_Y]);
120     outline.lineTo((float) corners[IsometryData.C4_X], (float) corners[IsometryData.C4_Y]);
121     outline.closePath();
122     return outline;
123   }
124 
125   
129   private void calculateCorners(final NodeRealizer context, final double[] corners) {
130     if (context instanceof GenericNodeRealizer) {
131       final IsometryData data = (IsometryData) ((GenericNodeRealizer) context).getUserData();
132       data.calculateCorners(corners);
133       IsometryData.moveTo(context.getX(), context.getY(), corners);
134     }
135   }
136 }
137