OSDN Git Service

8ab0aa6c863e0b2035c8cf05e656dd68e6b8d9e3
[midichordhelper/MIDIChordHelper.git] / src / camidion / chordhelper / mididevice / MidiDeviceTreeView.java
1 package camidion.chordhelper.mididevice;
2
3 import java.awt.Component;
4 import java.awt.datatransfer.DataFlavor;
5 import java.awt.datatransfer.Transferable;
6 import java.awt.dnd.DnDConstants;
7 import java.awt.dnd.DragGestureEvent;
8 import java.awt.dnd.DragGestureListener;
9 import java.awt.dnd.DragSource;
10
11 import javax.swing.JTree;
12 import javax.swing.event.InternalFrameAdapter;
13 import javax.swing.event.InternalFrameEvent;
14 import javax.swing.event.InternalFrameListener;
15 import javax.swing.tree.DefaultTreeCellRenderer;
16 import javax.swing.tree.TreeModel;
17
18 /**
19  * MIDIデバイスツリービュー
20  */
21 public class MidiDeviceTreeView extends JTree
22 {
23         /**
24          *      {@link MidiDeviceFrame} を閉じたことを検知して再描画するためのリスナー
25          */
26         public final InternalFrameListener midiDeviceFrameListener = new InternalFrameAdapter() {
27                 @Override
28                 public void internalFrameClosing(InternalFrameEvent e) { repaint(); }
29         };
30
31         public static final DataFlavor TREE_MODEL_FLAVOR = new DataFlavor(TreeModel.class, "TreeModel");
32
33         private Transferable draggingObject = new Transferable() {
34                 private DataFlavor flavors[] = {TREE_MODEL_FLAVOR};
35                 @Override
36                 public Object getTransferData(DataFlavor flavor) {
37                         return getLastSelectedPathComponent();
38                 }
39                 @Override
40                 public DataFlavor[] getTransferDataFlavors() { return flavors; }
41                 @Override
42                 public boolean isDataFlavorSupported(DataFlavor flavor) {
43                         return flavor.equals(TREE_MODEL_FLAVOR);
44                 }
45         };
46         /**
47          * MIDIデバイスツリービューを構築します。
48          * @param model このビューにデータを提供するモデル
49          */
50         public MidiDeviceTreeView(MidiDeviceTreeModel model) {
51                 super(model);
52                 (new DragSource()).createDefaultDragGestureRecognizer(
53                         this, DnDConstants.ACTION_COPY_OR_MOVE, new DragGestureListener() {
54                                 @Override
55                                 public void dragGestureRecognized(DragGestureEvent dge) {
56                                         if( (dge.getDragAction() & DnDConstants.ACTION_COPY_OR_MOVE) == 0 ) return;
57                                         dge.startDrag(DragSource.DefaultMoveDrop, draggingObject, null);
58                                 }
59                         }
60                 );
61                 setCellRenderer(new DefaultTreeCellRenderer() {
62                         @Override
63                         public Component getTreeCellRendererComponent(JTree tree, Object value,
64                                         boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)
65                         {
66                                 super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
67                                 if(leaf) {
68                                         setIcon(MidiConnecterListView.MIDI_CONNECTER_ICON);
69                                         setDisabledIcon(MidiConnecterListView.MIDI_CONNECTER_ICON);
70                                         setEnabled( ! ((MidiConnecterListModel)value).getMidiDevice().isOpen() );
71                                 }
72                                 return this;
73                         }
74                 });
75         }
76 }