1
28 package demo.layout.router;
29
30 import demo.view.advanced.EdgeConnectorDemo;
31 import y.base.Edge;
32 import y.base.Node;
33 import y.geom.YPoint;
34 import y.view.CreateEdgeMode;
35 import y.view.EdgeRealizer;
36 import y.view.Graph2D;
37 import y.view.Graph2DTraversal;
38 import y.view.HitInfo;
39 import y.view.NodeRealizer;
40
41 import java.awt.Color;
42
43
54 public class HubCreateEdgeMode extends CreateEdgeMode {
55 private Node sourceNode;
56 private Node targetNode;
57 private Edge sourceSplitEdge;
58 private Edge targetSplitEdge;
59 private Color color;
60 private final NodeRealizer hubRealizer;
61
62 public HubCreateEdgeMode(NodeRealizer hubRealizer) {
63 this.hubRealizer = hubRealizer;
64 allowSelfloopCreation(false);
65 setIndicatingTargetNode(true);
66 }
67
68 public NodeRealizer getHubRealizer() {
69 return hubRealizer;
70 }
71
72 public void mouseShiftPressedLeft(double x, double y) {
73 if (isEditing()) {
74 super.mouseShiftPressedLeft(x, y);
75 } else {
76 final Graph2D graph = getGraph2D();
77 final Edge edge = getHitInfo(x, y).getHitEdge();
78
79 if (edge != null) {
80 final EdgeRealizer edgeRealizer = graph.getRealizer(edge);
81 final double[] pathPoint = EdgeConnectorDemo.PointPathProjector.calculateClosestPathPoint(
82 edgeRealizer.getPath(), x, y);
83 color = edgeRealizer.getLineColor();
84
85 final NodeRealizer sourceRealizer = hubRealizer.createCopy();
86 sourceRealizer.setCenter(pathPoint[0], pathPoint[1]);
87 sourceRealizer.setFillColor(color);
88
89 sourceNode = graph.createNode(sourceRealizer);
90 sourceSplitEdge = edge;
91 view.updateView();
92 super.mouseShiftPressedLeft(pathPoint[0], pathPoint[1]);
93 } else {
94 sourceNode = null;
95 super.mouseShiftPressedLeft(x, y);
96 }
97 }
98 }
99
100 public void mouseShiftReleasedLeft(double x, double y) {
101 final Graph2D graph = getGraph2D();
102 final Edge edge = getHitInfo(x, y).getHitEdge();
103
104 if (edge != null) {
105 final double[] pathPoint = EdgeConnectorDemo.PointPathProjector.calculateClosestPathPoint(
106 graph.getRealizer(edge).getPath(), x, y);
107
108 final NodeRealizer targetRealizer = hubRealizer.createCopy();
109 targetRealizer.setCenter(pathPoint[0], pathPoint[1]);
110 targetRealizer.setFillColor(color);
111
112 targetNode = graph.createNode(targetRealizer);
113 targetSplitEdge = edge;
114 view.updateView();
115 super.mouseShiftReleasedLeft(pathPoint[0], pathPoint[1]);
116 } else {
117 super.mouseShiftReleasedLeft(x, y);
118 }
119 }
120
121 public HitInfo getHitInfo(double x, double y) {
122 final HitInfo info = view.getHitInfoFactory().createHitInfo(x, y, Graph2DTraversal.ALL, false);
123 setLastHitInfo(info);
124 return info;
125 }
126
127 protected void edgeCreated(Edge edge) {
128 if (sourceNode != null) {
129 splitEdge(sourceSplitEdge, sourceNode);
130 }
131 if (targetNode != null) {
132 splitEdge(targetSplitEdge, targetNode);
133 }
134 super.edgeCreated(edge);
135 }
136
137
140 private void splitEdge(Edge edge, Node node) {
141 final Graph2D graph = getGraph2D();
142 final Node oldSource = edge.source();
143 final Node oldTarget = edge.target();
144
145 graph.firePreEvent();
146
150 final EdgeRealizer originalRealizer = graph.getRealizer(edge).createCopy();
153 if (!BusRouterDemo.isHub(oldSource)) {
154 graph.changeEdge(edge, oldSource, node);
155
156 final Edge edgeToTarget = graph.createEdge(node, oldTarget);
157 graph.setRealizer(edgeToTarget, originalRealizer);
158 graph.setSourcePointRel(edgeToTarget, YPoint.ORIGIN);
159 } else {
160 graph.changeEdge(edge, node, oldTarget);
161
162 final Edge edgeFromSource = graph.createEdge(oldSource, node);
163 graph.setRealizer(edgeFromSource, originalRealizer);
164 graph.setTargetPointRel(edgeFromSource, YPoint.ORIGIN);
165 }
166
167 graph.firePostEvent();
168 }
169
170 protected void cancelEdgeCreation() {
171 if (sourceNode != null) {
172 Node tmp = sourceNode;
173 sourceNode = null;
174 getGraph2D().removeNode(tmp);
175 }
176 if (targetNode != null) {
177 Node tmp = targetNode;
178 targetNode = null;
179 getGraph2D().removeNode(tmp);
180 }
181
182 super.cancelEdgeCreation();
183 }
184
185 public void setEditing(boolean editing) {
186 if (!editing) {
187 sourceNode = null;
188 sourceSplitEdge = null;
189 targetNode = null;
190 targetSplitEdge = null;
191 color = null;
192 }
193
194 super.setEditing(editing);
195 }
196
197
201 protected boolean acceptSourceNode(Node source, double x, double y) {
202 if (color == null) {
203 color = BusRouterDemo.isHub(source) ? view.getGraph2D().getRealizer(source).getFillColor() : Color.BLACK;
204 }
205 return BusRouterDemo.isHub(source) || super.acceptSourceNode(source, x, y);
206 }
207
208
211 protected boolean acceptTargetNode(Node target, double x, double y) {
212 return (BusRouterDemo.isHub(target) && color != null && !color.equals(
213 getGraph2D().getRealizer(target).getFillColor())) || super.acceptTargetNode(target, x, y);
214 }
215
216
217
220 protected EdgeRealizer getDummyEdgeRealizer() {
221 final EdgeRealizer realizer = super.getDummyEdgeRealizer();
222 if (color != null) {
223 realizer.setLineColor(color);
224 }
225 return realizer;
226 }
227 }
228