1
14
15 package demo.yext.svg;
16
17 import java.awt.Color;
18 import java.awt.Graphics2D;
19 import y.base.Edge;
20 import y.base.EdgeCursor;
21 import y.base.EdgeMap;
22 import y.base.Node;
23 import y.base.NodeCursor;
24 import y.util.Maps;
25 import y.view.Arrow;
26 import y.view.EdgeRealizer;
27 import y.view.Graph2D;
28 import y.view.LineType;
29 import yext.svg.io.SVGDOMEnhancer;
30 import yext.svg.io.SVGIOHandler;
31
32
33
38 public class HighlightConnectionsDemo extends SVGExportDemo
39 {
40
41
44 public HighlightConnectionsDemo()
45 {
46 view.getGraph2D().getDefaultEdgeRealizer().setTargetArrow(Arrow.STANDARD);
47 }
48
49
54 protected SVGIOHandler createSVGIOHandler(boolean svgz)
55 {
56 SVGIOHandler ioh = super.createSVGIOHandler(svgz);
57 SVGDOMEnhancer enhancer = new HighlightConnections();
58 ioh.setSVGGraph2DRenderer(enhancer);
59 return ioh;
60 }
61
62
66 class HighlightConnections extends SVGDOMEnhancer
67 {
68 private EdgeMap edgeType;
69
70
75 protected void initializeDOM()
76 {
77 Graph2D graph = view.getGraph2D();
78 edgeType = Maps.createIndexEdgeMap(new Object[graph.E()]);
79 addToSVGDefinition(createScript());
80 }
81
82
91 protected void paint(Graphics2D gfx, EdgeRealizer r, boolean sloppyMode)
92 {
93 Edge e = r.getEdge();
94 Color lineColor = r.getLineColor();
95 LineType lineType = r.getLineType();
96
97 edgeType.set(e, Color.black);
98 super.paint(gfx, r, sloppyMode);
99
100 r.setLineColor(Color.red);
101 r.setLineType(LineType.LINE_3);
102 edgeType.set(e, Color.red);
103 super.paint(gfx, r, sloppyMode);
104
105
106 r.setLineColor(Color.green);
107 r.setLineType(LineType.LINE_3);
108 edgeType.set(e, Color.green);
109 super.paint(gfx, r, sloppyMode);
110
111 r.setLineType(lineType);
112 r.setLineColor(lineColor);
113 }
114
115
118 protected String createGroupID(Edge e)
119 {
120 if(edgeType.get(e) == Color.green)
121 {
122 return "green.y.edge." + e.index();
123 }
124 else if(edgeType.get(e) == Color.red)
125 {
126 return "red.y.edge." + e.index();
127 }
128 else
129 {
130 return "black.y.edge." + e.index();
131 }
132 }
133
134
135
140 protected void nodeAddedToDOM(Node yNode, org.w3c.dom.Element element)
141 {
142 element.setAttribute(
143 "onmouseover",
144 "highlightEdges(evt,'" + yNode.index() + "')");
145 element.setAttribute(
146 "onmouseout",
147 "lowlightEdges(evt,'" + yNode.index() + "')");
148 }
149
150
154 protected void edgeAddedToDOM(Edge yEdge, org.w3c.dom.Element element)
155 {
156 if(edgeType.get(yEdge) != Color.black)
157 {
158 element.setAttribute("visibility", "hidden");
159 }
160 }
161
162
168 private org.w3c.dom.Element createScript()
169 {
170 org.w3c.dom.Element script = createElement("script");
171 script.setAttribute("type","text/ecmascript");
172
173 Graph2D graph = view.getGraph2D();
174
175 StringBuffer varInEdges = new StringBuffer("var inEdges = [");
178 StringBuffer varOutEdges = new StringBuffer("var outEdges = [");
179 for(NodeCursor nc = graph.nodes(); nc.ok(); nc.next())
180 {
181 Node v = nc.node();
182 varInEdges.append("[");
183 for(EdgeCursor ec = v.inEdges(); ec.ok(); ec.next())
184 {
185 varInEdges.append("" + ec.edge().index() + (v.lastInEdge() == ec.edge()?"":","));
186 }
187 varInEdges.append("]");
188
189 varOutEdges.append("[");
190 for(EdgeCursor ec = v.outEdges(); ec.ok(); ec.next())
191 {
192 varOutEdges.append("" + ec.edge().index() + (v.lastOutEdge() == ec.edge()?"":","));
193 }
194 varOutEdges.append("]");
195
196 if(v.index() < graph.N()-1)
197 {
198 varInEdges.append(",");
199 varOutEdges.append(",");
200 }
201 }
202 varInEdges.append("];");
203 varOutEdges.append("];");
204
205 String highlightEdges =
208 "function highlightEdges(evt, nodeId) { \n" +
209 " var document = evt.target.ownerDocument; \n" +
210 " edgeIds = inEdges[nodeId]; \n" +
211 " for(i = 0; i < edgeIds.length; i++) { \n" +
212 " var red = document.getElementById('red.y.edge.' + edgeIds[i]); \n" +
213 " var green = document.getElementById('green.y.edge.' + edgeIds[i]); \n" +
214 " var black = document.getElementById('black.y.edge.' + edgeIds[i]); \n" +
215 " red.setAttributeNS(null, 'style'," + "'visibility:visible'); \n" +
216 " green.setAttributeNS(null, 'style'," + "'visibility:hidden'); \n" +
217 " black.setAttributeNS(null, 'style'," + "'visibility:hidden'); \n" +
218 " } \n" +
219 " edgeIds = outEdges[nodeId]; \n" +
220 " for(i = 0; i < edgeIds.length; i++) { \n" +
221 " var red = document.getElementById('red.y.edge.' + edgeIds[i]); \n" +
222 " var green = document.getElementById('green.y.edge.' + edgeIds[i]); \n" +
223 " var black = document.getElementById('black.y.edge.' + edgeIds[i]); \n" +
224 " red.setAttributeNS(null, 'style'," + "'visibility:hidden'); \n" +
225 " green.setAttributeNS(null, 'style'," + "'visibility:visible'); \n" +
226 " black.setAttributeNS(null, 'style'," + "'visibility:hidden'); \n" +
227 " } \n" +
228 "};";
229
230 String lowlightEdges =
233 "function lowlightEdges(evt, nodeId) { \n" +
234 " var document = evt.target.ownerDocument; \n" +
235 " edgeIds = inEdges[nodeId]; \n" +
236 " for(i = 0; i < edgeIds.length; i++) { \n" +
237 " var red = document.getElementById('red.y.edge.' + edgeIds[i]); \n" +
238 " var green = document.getElementById('green.y.edge.' + edgeIds[i]); \n" +
239 " var black = document.getElementById('black.y.edge.' + edgeIds[i]); \n" +
240 " red.setAttributeNS(null, 'style'," + "'visibility:hidden'); \n" +
241 " green.setAttributeNS(null, 'style'," + "'visibility:hidden'); \n" +
242 " black.setAttributeNS(null, 'style'," + "'visibility:visible'); \n" +
243 " } \n" +
244 " edgeIds = outEdges[nodeId]; \n" +
245 " for(i = 0; i < edgeIds.length; i++) { \n" +
246 " var red = document.getElementById('red.y.edge.' + edgeIds[i]); \n" +
247 " var green = document.getElementById('green.y.edge.' + edgeIds[i]); \n" +
248 " var black = document.getElementById('black.y.edge.' + edgeIds[i]); \n" +
249 " red.setAttributeNS(null, 'style'," + "'visibility:hidden'); \n" +
250 " green.setAttributeNS(null, 'style'," + "'visibility:hidden'); \n" +
251 " black.setAttributeNS(null, 'style'," + "'visibility:visible'); \n" +
252 " } \n" +
253 "};";
254
255 script.appendChild(createCDATASection(
256 varInEdges + "\n" +
257 varOutEdges + "\n" +
258 highlightEdges + "\n" +
259 lowlightEdges
260 ));
261
262 return script;
263 }
264 };
265
266
269 public static void main(String args[])
270 {
271 initLnF();
272 HighlightConnectionsDemo demo = new HighlightConnectionsDemo();
273 demo.start();
274 }
275
276 }