1 package com.bonevich.erj.diagram;
2
3 import com.bonevich.erj.model.*;
4 import com.bonevich.erj.ui.TransferableModelElement;
5
6 import org.tigris.gef.base.Layer;
7 import org.tigris.gef.presentation.Fig;
8 import org.tigris.gef.presentation.FigNode;
9 import org.tigris.gef.presentation.FigEdge;
10 import org.tigris.gef.graph.presentation.JGraph;
11
12 import java.awt.Point;
13 import java.awt.dnd.*;
14 import java.awt.datatransfer.Transferable;
15
16 public class ERDiagramGraph extends JGraph
17 implements DropTargetListener
18 {
19 private DropTarget _dropTarget;
20 private Object _elt;
21
22 public ERDiagramGraph(ERDiagram diagram)
23 {
24 super(diagram);
25 _dropTarget = new DropTarget(this, this);
26 }
27
28 //////////////////////////////////////////////////////////
29 // DropTargetListener implementation
30 public void dragEnter(DropTargetDragEvent drop)
31 {
32 acceptOrRejectDrop(drop, isDropAcceptable(drop));
33 }
34
35 public void dragExit(DropTargetEvent drop)
36 {
37 }
38
39 public void dragOver(DropTargetDragEvent drop)
40 {
41 acceptOrRejectDrop(drop, isDropAcceptable(drop));
42 }
43
44 public void dropActionChanged(DropTargetDragEvent drop)
45 {
46 acceptOrRejectDrop(drop, isDropAcceptable(drop));
47 }
48
49 public synchronized void drop(DropTargetDropEvent drop)
50 {
51 if (!isDropAcceptable(drop))
52 {
53 drop.rejectDrop();
54 return;
55 }
56 drop.acceptDrop(drop.getDropAction());
57 try
58 {
59 Transferable data = drop.getTransferable();
60 if (data.isDataFlavorSupported(TransferableModelElement.MODEL_ELEMENT_FLAVOR))
61 {
62 _elt = data.getTransferData(TransferableModelElement.MODEL_ELEMENT_FLAVOR);
63
64 // make sure this element is not already in the diagram
65 // attributes will always return null
66 Layer layer = _editor.getLayerManager().getActiveLayer();
67 if (layer.presentationFor(_elt) != null)
68 {
69 drop.dropComplete(false);
70 return;
71 }
72
73 Point location = drop.getLocation();
74 if (_elt instanceof Relation)
75 {
76 addFigNode((Relation) _elt, location);
77 }
78 else if (_elt instanceof ForeignKey)
79 {
80 // if only one or neither end-node are present, add them
81 ForeignKey fk = (ForeignKey) _elt;
82 Relation relation = fk.getRelation();
83 Relation referent = fk.getReferentRelation();
84 int offsetX = 30, offsetY = 50;
85 if (layer.presentationFor(relation) == null)
86 {
87 addFigNode(relation, new Point(location.x+offsetX, location.y+offsetY));
88 }
89 if (layer.presentationFor(referent) == null)
90 {
91 addFigNode(referent, new Point(location.x-offsetX, location.y-offsetY));
92 }
93
94 // connect to the nodes
95 FigEdge edge = _editor.getGraphEdgeRenderer().getFigEdgeFor(
96 _editor.getGraphModel(), layer, _elt
97 );
98 _editor.add(edge);
99 _editor.damaged(edge);
100 _editor.getSelectionManager().select(edge);
101 }
102 else if (_elt instanceof Attribute)
103 {
104 Attribute attr = (Attribute) _elt;
105 // make sure it is over a relation
106 Fig hit = _editor.hit(location);
107 if (hit instanceof FigRelation)
108 {
109 FigRelation fig = (FigRelation) hit;
110 Relation relation = (Relation) fig.getOwner();
111 if (attr.getRelation() == relation)
112 {
113 drop.dropComplete(false);
114 return;
115 }
116 relation.createAttribute(attr);
117 _editor.damaged(fig);
118 }
119 else
120 {
121 drop.dropComplete(false);
122 return;
123 }
124 }
125 }
126 else
127 {
128 System.err.println("You can't drop that here, dammit!");
129 drop.dropComplete(false);
130 return;
131 }
132 }
133 catch (Exception e)
134 {
135 e.printStackTrace();
136 drop.dropComplete(false);
137 return;
138 }
139
140 drop.dropComplete(true);
141 }
142
143 private boolean isDropAcceptable(DropTargetDragEvent drop)
144 {
145 if ((drop.getDropAction() & DnDConstants.ACTION_COPY_OR_MOVE) == 0)
146 {
147 return false;
148 }
149
150 if (!drop.isDataFlavorSupported(TransferableModelElement.MODEL_ELEMENT_FLAVOR))
151 {
152 return false;
153 }
154 return true;
155 }
156
157 private boolean isDropAcceptable(DropTargetDropEvent drop)
158 {
159 if ((drop.getDropAction() & DnDConstants.ACTION_COPY_OR_MOVE) == 0)
160 {
161 return false;
162 }
163
164 if (!drop.isDataFlavorSupported(TransferableModelElement.MODEL_ELEMENT_FLAVOR))
165 {
166 return false;
167 }
168 return true;
169 }
170
171 private void acceptOrRejectDrop(DropTargetDragEvent drop, boolean droppable)
172 {
173 if (droppable)
174 {
175 drop.acceptDrag(drop.getDropAction());
176 }
177 else
178 {
179 drop.rejectDrag();
180 }
181 }
182
183 private void addFigNode(Relation relation, Point snapPt)
184 {
185 // create a new FigRelation
186 Layer layer = _editor.getLayerManager().getActiveLayer();
187 FigNode node = _editor.getGraphNodeRenderer().getFigNodeFor(
188 _editor.getGraphModel(), layer, relation
189 );
190 _editor.snap(snapPt);
191 node.setLocation(snapPt.x, snapPt.y);
192 _editor.add(node);
193 _editor.damaged(node);
194 _editor.getSelectionManager().select(node);
195 }
196 } /*** end class ERDiagramGraph */
This page was automatically generated by Maven