View Javadoc
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