1
28 package demo.view.uml;
29
30 import y.base.Edge;
31 import y.base.Node;
32 import y.base.NodeCursor;
33 import y.base.NodeList;
34 import y.layout.router.polyline.EdgeRouter;
35 import y.util.DataProviderAdapter;
36 import y.view.Drawable;
37 import y.view.Graph2D;
38 import y.view.Graph2DLayoutExecutor;
39 import y.view.MoveSelectionMode;
40 import y.view.NodeRealizer;
41
42 import java.awt.Graphics2D;
43 import java.awt.Rectangle;
44 import java.awt.geom.Rectangle2D;
45
46
51 class UmlCreateEdgeMode extends MoveSelectionMode {
52 private final EdgeRouter edgeRouter;
53 private Node sourceNode;
54 private Node targetNode;
55
56 private Node draggedNode;
57 private Drawable targetNodeIndicator;
58
59 UmlCreateEdgeMode(final EdgeRouter edgeRouter) {
60 this.edgeRouter = edgeRouter;
61 targetNodeIndicator = new Drawable() {
63 public void paint(Graphics2D graphics) {
64 if (targetNode != null) {
65 drawTargetNodeIndicator(graphics, getGraph2D().getRealizer(targetNode));
66 }
67 }
68
69 public Rectangle getBounds() {
70 if (targetNode != null) {
71 return getTargetNodeIndicatorBounds(getGraph2D().getRealizer(targetNode)).getBounds();
72 } else {
73 return new Rectangle(0, 0, -1, -1);
74 }
75 }
76 };
77 }
78
79
83 public void mousePressedLeft(double x, double y) {
84 if (sourceNode != null) {
85 final Graph2D graph = getGraph2D();
86 graph.firePreEvent();
87
88 draggedNode = graph.createNode();
91 UmlRealizerFactory.setNodeOpacity(graph.getRealizer(draggedNode), UmlRealizerFactory.TRANSPARENT);
92 graph.setCenter(draggedNode, x, y);
93 graph.createEdge(sourceNode, draggedNode);
94
95 super.mousePressedLeft(x, y);
96 }
97 }
98
99
104 protected NodeList getNodesToBeMoved() {
105 final NodeList nodesToBeMoved = new NodeList();
106 if (draggedNode != null) {
107 nodesToBeMoved.add(draggedNode);
108 }
109 return nodesToBeMoved;
110 }
111
112
116 public void mouseDraggedLeft(final double x, final double y) {
117 if (sourceNode != null) {
118 updateTargetNode();
120
121 super.mouseDraggedLeft(x, y);
122 }
123 }
124
125
129 private void updateTargetNode() {
130 final Graph2D graph = getGraph2D();
131
132 Node newTargetNode = null;
135 for (NodeCursor nc = graph.nodes(); nc.ok(); nc.next()) {
136 final Node node = nc.node();
137 if (node != draggedNode) {
138 final NodeRealizer realizer = graph.getRealizer(node);
139 final Rectangle2D.Double bounds = realizer.getBoundingBox();
140 if (bounds.contains(graph.getCenterX(draggedNode), graph.getCenterY(draggedNode))
141 && (newTargetNode == null || newTargetNode.index() < node.index())) {
142 newTargetNode = node;
143 }
144 }
145 }
146
147 if (newTargetNode != targetNode) {
149 targetNode = newTargetNode;
150 updateTargetNodeIndicator();
151 }
152 }
153
154
157 private void updateTargetNodeIndicator() {
158 view.removeDrawable(targetNodeIndicator);
159 if (targetNode != null) {
160 view.addDrawable(targetNodeIndicator);
161 }
162 }
163
164
168 public void mouseReleasedLeft(double x, double y) {
169 if (sourceNode != null) {
170 final Graph2D graph = getGraph2D();
171 final Edge draggedEdge = draggedNode.lastInEdge();
172 if (targetNode != null) {
173 graph.changeEdge(draggedEdge, draggedEdge.source(), targetNode);
176 graph.removeNode(draggedNode);
177 } else {
178 UmlRealizerFactory.setNodeOpacity(graph.getRealizer(draggedNode), UmlRealizerFactory.OPAQUE);
179 }
180
181 view.removeDrawable(targetNodeIndicator);
183
184 graph.firePostEvent();
186
187 edgeCreated(draggedEdge);
188
189 draggedNode = null;
190 targetNode = null;
191 sourceNode = null;
192
193 super.mouseReleasedLeft(x, y);
194 }
195 }
196
197
200 public void mouseDraggedRight(double x, double y) {
201 }
202
203
206 public void mouseReleasedRight(double x, double y) {
207 }
208
209
212 public void cancelEditing() throws UnsupportedOperationException {
213 if (draggedNode != null) {
215 getGraph2D().removeNode(draggedNode);
216 }
217 draggedNode = null;
218 targetNode = null;
219 sourceNode = null;
220 view.removeDrawable(targetNodeIndicator);
221
222 super.cancelEditing();
223 }
224
225
228 public void setSourceNode(Node sourceNode) {
229 this.sourceNode = sourceNode;
230 }
231
232
235 protected void edgeCreated(final Edge edge) {
236 final Graph2D graph = getGraph2D();
237 final DataProviderAdapter selectedEdges = new DataProviderAdapter() {
238 public boolean getBool(Object dataHolder) {
239 return dataHolder == edge;
240 }
241 };
242 edgeRouter.setSphereOfAction(EdgeRouter.ROUTE_SELECTED_EDGES);
243 graph.addDataProvider(EdgeRouter.SELECTED_EDGES, selectedEdges);
244 try {
245 final Graph2DLayoutExecutor executor = new Graph2DLayoutExecutor();
246 executor.getLayoutMorpher().setKeepZoomFactor(true);
247 executor.doLayout(view, edgeRouter);
248 } finally {
249 graph.removeDataProvider(EdgeRouter.SELECTED_EDGES);
250 }
251 }
252 }
253