01: package jimm.datavision.gui;
02:
03: import java.awt.datatransfer.*;
04: import java.awt.dnd.*;
05: import java.awt.event.MouseAdapter;
06: import java.awt.event.MouseEvent;
07: import javax.swing.*;
08: import javax.swing.tree.*;
09:
10: /**
11: * The {#link FieldPickerWin} uses this JTree subclass.
12: *
13: * @author Jim Menard, <a href="mailto:jimm@io.com">jimm@io.com</a>
14: */
15: public class FieldPickerTree extends JTree implements
16: DragGestureListener, DragSourceListener {
17:
18: public FieldPickerTree(DefaultTreeModel model) {
19: super (model);
20:
21: DragSource dragSource = DragSource.getDefaultDragSource();
22:
23: dragSource.createDefaultDragGestureRecognizer(this , // component where drag originates
24: DnDConstants.ACTION_COPY_OR_MOVE, // actions
25: this ); // drag gesture recognizer
26:
27: // Listen for double clicks
28: addMouseListener(new MouseAdapter() {
29: public void mousePressed(MouseEvent e) {
30: // int selRow = getRowForLocation(e.getX(), e.getY());
31: TreePath selPath = getPathForLocation(e.getX(), e
32: .getY());
33: if (selPath != null && e.getClickCount() == 2)
34: doubleClicked(selPath);
35: super .mousePressed(e);
36: }
37: });
38: }
39:
40: /**
41: * Handles double clicks. Opens an editor if one is available. The
42: * <code>FPLeafInfo</code> subclasses know how to open themselves, and
43: * it is harmless to try to open one that has no editor.
44: *
45: * @param selPath a tree path
46: */
47: protected void doubleClicked(TreePath selPath) {
48: DefaultMutableTreeNode typeNode = (DefaultMutableTreeNode) getSelectionPath()
49: .getLastPathComponent();
50: Object obj = typeNode.getUserObject();
51: if (obj instanceof FPLeafInfo)
52: ((FPLeafInfo) obj).openEditor();
53: }
54:
55: public void dragGestureRecognized(DragGestureEvent e) {
56: DefaultMutableTreeNode typeNode = (DefaultMutableTreeNode) getSelectionPath()
57: .getLastPathComponent();
58: Object obj = typeNode.getUserObject();
59: if (obj instanceof FPLeafInfo) {
60: FPLeafInfo info = (FPLeafInfo) obj;
61: if (info != null) {
62: e.startDrag(DragSource.DefaultCopyDrop, // cursor
63: new StringSelection(info.dragString()), // transferable
64: this ); // drag source listener
65: }
66: }
67: }
68:
69: public void dragDropEnd(DragSourceDropEvent e) {
70: }
71:
72: public void dragEnter(DragSourceDragEvent e) {
73: }
74:
75: public void dragExit(DragSourceEvent e) {
76: }
77:
78: public void dragOver(DragSourceDragEvent e) {
79: }
80:
81: public void dropActionChanged(DragSourceDragEvent e) {
82: }
83:
84: /** Removes the currently selected node. */
85: public void removeCurrentNode() {
86: TreePath currentSelection = getSelectionPath();
87: if (currentSelection != null) {
88: DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) (currentSelection
89: .getLastPathComponent());
90: MutableTreeNode parent = (MutableTreeNode) (currentNode
91: .getParent());
92: if (parent != null) {
93: ((DefaultTreeModel) getModel())
94: .removeNodeFromParent(currentNode);
95: }
96: }
97: }
98:
99: }
|