1
28
29 package demo.view.application;
30
31 import demo.view.DemoBase;
32 import y.base.Node;
33 import y.option.RealizerCellRenderer;
34 import y.view.Arrow;
35 import y.view.BezierEdgeRealizer;
36 import y.view.Drawable;
37 import y.view.DropSupport;
38 import y.view.EdgeRealizer;
39 import y.view.Graph2DView;
40 import y.view.NodeLabel;
41 import y.view.NodeRealizer;
42 import y.view.PolyLineEdgeRealizer;
43 import y.view.QuadCurveEdgeRealizer;
44 import y.view.ShapeNodeRealizer;
45 import y.view.SmartNodeLabelModel;
46 import y.view.SplineEdgeRealizer;
47
48 import javax.swing.AbstractAction;
49 import javax.swing.AbstractButton;
50 import javax.swing.JList;
51 import javax.swing.JScrollPane;
52 import javax.swing.JToggleButton;
53 import javax.swing.JToolBar;
54 import javax.swing.ListSelectionModel;
55 import javax.swing.event.ListSelectionEvent;
56 import javax.swing.event.ListSelectionListener;
57 import java.awt.BorderLayout;
58 import java.awt.Color;
59 import java.awt.EventQueue;
60 import java.awt.dnd.DnDConstants;
61 import java.awt.dnd.DragGestureEvent;
62 import java.awt.dnd.DragGestureListener;
63 import java.awt.dnd.DragSource;
64 import java.awt.event.ActionEvent;
65 import java.util.ArrayList;
66 import java.util.Collection;
67 import java.util.Iterator;
68 import java.util.List;
69 import java.util.Locale;
70 import java.util.Map;
71
72
83 public class DragAndDropDemo extends DemoBase {
84 private final DragAndDropSupport dndSupport;
85
86
87 public DragAndDropDemo() {
88 dndSupport = createDragAndDropSupport();
90
91 final JList realizerList = dndSupport.getList();
93
94 contentPane.add(new JScrollPane(realizerList), BorderLayout.WEST);
96 }
97
98
102 protected DragAndDropSupport createDragAndDropSupport() {
103 return new DragAndDropSupport(createRealizers(), view);
104 }
105
106
109 protected JToolBar createToolBar() {
110 final JToggleButton snapLineButton = new JToggleButton(new AbstractAction("Snapping") {
111 public void actionPerformed(ActionEvent e) {
112 dndSupport.configureSnapping(((AbstractButton) e.getSource()).isSelected(), 30.0, 15.0, true);
113 }
114 });
115 snapLineButton.setIcon(getIconResource("resource/mode_snapping.png"));
116
117 final JToolBar toolbar = super.createToolBar();
118 toolbar.addSeparator();
119 toolbar.add(snapLineButton);
120 return toolbar;
121 }
122
123
128 protected Collection createRealizers()
129 {
130 List result = new ArrayList();
131
132 Map shapeTypeToStringMap = ShapeNodeRealizer.shapeTypeToStringMap();
133 float hueIncrease = 1.0f / (float) shapeTypeToStringMap.size();
134 float hue = 0.0f;
135 for (Iterator iter = shapeTypeToStringMap.keySet().iterator(); iter.hasNext(); hue += hueIncrease) {
136 Byte shapeType = (Byte) iter.next();
137 ShapeNodeRealizer r = new ShapeNodeRealizer(shapeType.byteValue());
138 r.setWidth(100.0);
139 r.setLabelText((String) shapeTypeToStringMap.get(shapeType));
140 r.setFillColor(new Color(Color.HSBtoRGB(hue, 0.5f, 1.0f)));
141 NodeLabel label = r.getLabel();
142 SmartNodeLabelModel model = new SmartNodeLabelModel();
143 label.setLabelModel(model, model.getDefaultParameter());
144 result.add(r);
145 }
146
147 final PolyLineEdgeRealizer smoothedPolyLine = new PolyLineEdgeRealizer();
148 smoothedPolyLine.setSmoothedBends(true);
149
150 List edgeRealizers = new ArrayList();
151 edgeRealizers.add(new PolyLineEdgeRealizer());
152 edgeRealizers.add(smoothedPolyLine);
153 edgeRealizers.add(new QuadCurveEdgeRealizer());
154 edgeRealizers.add(new BezierEdgeRealizer());
155 edgeRealizers.add(new SplineEdgeRealizer());
156
157 for (Iterator iterator = edgeRealizers.iterator(); iterator.hasNext();) {
159 EdgeRealizer edgeRealizer = (EdgeRealizer) iterator.next();
160 edgeRealizer.setTargetArrow(Arrow.STANDARD);
161 }
162
163 result.addAll(edgeRealizers);
164
165 return result;
166 }
167
168
172 public static class DragAndDropSupport {
173 protected JList realizerList;
174 protected DropSupport dropSupport;
175
176
177 public DragAndDropSupport(Collection realizerList, final Graph2DView view) {
178 this(realizerList.toArray(), view);
179 }
180
181 public DragAndDropSupport(Object[] realizers, final Graph2DView view) {
182 this(realizers, view, 120, 45);
183 }
184
185 public DragAndDropSupport(Object[] realizers, final Graph2DView view, int itemWidth, int itemHeight) {
186 initializeDropSupport(view);
187 initializeRealizerList(realizers, view, itemWidth, itemHeight);
188 initializeDragSource();
189 }
190
191
194 protected void initializeDropSupport(final Graph2DView view) {
195 dropSupport = new DropSupport(view) {
196 protected Node createNode(Graph2DView view, NodeRealizer r, double worldCoordX, double worldCoordY) {
197 final Node node = super.createNode(view, r, worldCoordX, worldCoordY);
198 nodeCreated(node, worldCoordX, worldCoordY);
199 return node;
200 }
201 };
202
203 dropSupport.setPreviewEnabled(true);
204 dropSupport.setIndicatingSourceNode(true);
205
206 dropSupport.setEdgeSplittingEnabled(true);
208 dropSupport.getEdgeSplitSupport().setRemovingInnerBends(true);
210 }
211
212
215 protected void initializeRealizerList(Object[] realizers, final Graph2DView view, int itemWidth, int itemHeight) {
216 realizerList = new JList(realizers);
217 realizerList.setCellRenderer(createCellRenderer(itemWidth, itemHeight));
218
219 realizerList.addListSelectionListener(new ListSelectionListener() {
221 public void valueChanged(ListSelectionEvent e) {
222 if (realizerList.getSelectedValue() instanceof NodeRealizer) {
223 nodeRealizerSelected(view, (NodeRealizer) realizerList.getSelectedValue());
224 } else if (realizerList.getSelectedValue() instanceof EdgeRealizer) {
225 edgeRealizerSelected(view, (EdgeRealizer) realizerList.getSelectedValue());
226 }
227 }
228 });
229
230 realizerList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
231 realizerList.setSelectedIndex(0);
232 }
233
234
237 protected void initializeDragSource() {
238 final DragSource dragSource = new DragSource();
239 dragSource.createDefaultDragGestureRecognizer(realizerList, DnDConstants.ACTION_MOVE,
240 new DragGestureListener() {
241 public void dragGestureRecognized(DragGestureEvent event) {
242 final Object value = realizerList.getSelectedValue();
243 if (value instanceof NodeRealizer) {
244 NodeRealizer nr = (NodeRealizer) value;
245 dropSupport.startDrag(dragSource, nr, event, DragSource.DefaultMoveDrop);
247 } else if (value instanceof EdgeRealizer) {
248 EdgeRealizer nr = (EdgeRealizer) value;
249 dropSupport.startDrag(dragSource, nr, event, DragSource.DefaultMoveDrop);
251 }
252 }
253 });
254 }
255
256
259 public void configureSnapping(final SnappingConfiguration config, final boolean previewEnabled) {
260 dropSupport.setSnappingEnabled(config.isSnappingEnabled() || config.isGridSnappingEnabled());
261 config.configureSnapContext(dropSupport.getSnapContext());
262 dropSupport.setPreviewEnabled(previewEnabled);
263 }
264
265
268 public void configureSnapping(final boolean snapping, final double nodeToNodeDistance,
269 final double nodeToEdgeDistance, final boolean previewEnabled) {
270 dropSupport.setSnappingEnabled(snapping);
271 dropSupport.getSnapContext().setNodeToNodeDistance(nodeToNodeDistance);
272 dropSupport.getSnapContext().setNodeToEdgeDistance(nodeToEdgeDistance);
273 dropSupport.getSnapContext().setUsingSegmentSnapLines(snapping);
274 dropSupport.setPreviewEnabled(previewEnabled);
275 }
276
277
280 protected RealizerCellRenderer createCellRenderer(int itemWidth, int itemHeight) {
281 return new RealizerCellRenderer(itemWidth, itemHeight);
282 }
283
284 protected void nodeCreated(Node node, double worldCoordX, double worldCoordY) {
285 }
286
287
291 protected void nodeRealizerSelected(Graph2DView view, NodeRealizer realizer) {
292 view.getGraph2D().setDefaultNodeRealizer(realizer);
293 }
294
295
299 protected void edgeRealizerSelected(Graph2DView view, EdgeRealizer realizer) {
300 view.getGraph2D().setDefaultEdgeRealizer(realizer);
301 }
302
303
306 public JList getList() {
307 return realizerList;
308 }
309 }
310
311
314 public static void main(String[] args) {
315 EventQueue.invokeLater(new Runnable() {
316 public void run() {
317 Locale.setDefault(Locale.ENGLISH);
318 initLnF();
319 (new DragAndDropDemo()).start("Drag and Drop Demo");
320 }
321 });
322 }
323 }
324