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