OSDN Git Service

e8bd6a00df6fc611755767a98d15c65e35ad75a2
[midichordhelper/MIDIChordHelper.git] / src / camidion / chordhelper / mididevice / MidiDeviceTreeView.java
1 package camidion.chordhelper.mididevice;
2
3 import java.awt.Component;
4 import java.awt.Point;
5 import java.awt.datatransfer.DataFlavor;
6 import java.awt.datatransfer.Transferable;
7 import java.awt.dnd.DnDConstants;
8 import java.awt.dnd.DragGestureEvent;
9 import java.awt.dnd.DragGestureListener;
10 import java.awt.dnd.DragSource;
11 import java.awt.dnd.DragSourceAdapter;
12 import java.awt.dnd.DragSourceDropEvent;
13 import java.awt.dnd.DragSourceListener;
14
15 import javax.swing.JInternalFrame;
16 import javax.swing.JTree;
17 import javax.swing.ListModel;
18 import javax.swing.ToolTipManager;
19 import javax.swing.event.InternalFrameAdapter;
20 import javax.swing.event.InternalFrameEvent;
21 import javax.swing.event.InternalFrameListener;
22 import javax.swing.tree.DefaultTreeCellRenderer;
23
24 /**
25  * MIDIデバイスツリービュー
26  */
27 public class MidiDeviceTreeView extends JTree {
28
29         public static final DataFlavor LIST_MODEL_FLAVOR  = new DataFlavor(ListModel.class,"ListModel");
30
31         public class DraggingObject implements Transferable {
32                 private DataFlavor flavors[] = {LIST_MODEL_FLAVOR};
33                 private MidiTransceiverListModel trxListModel;
34                 @Override
35                 public Object getTransferData(DataFlavor flavor) {
36                         return flavor.getRepresentationClass().isInstance(trxListModel) ? trxListModel : null;
37                 }
38                 @Override
39                 public DataFlavor[] getTransferDataFlavors() { return flavors; }
40                 @Override
41                 public boolean isDataFlavorSupported(DataFlavor flavor) {
42                         return flavors[0].equals(flavor);
43                 }
44         };
45         private DraggingObject draggingObject = new DraggingObject();
46         /**
47          * このツリーからドラッグしたMIDIデバイスのドロップが成功したときに再描画するためのリスナー
48          */
49         private DragSourceListener dragSourceListener = new DragSourceAdapter() {
50                 @Override
51                 public void dragDropEnd(DragSourceDropEvent dsde) {
52                         if( dsde.getDropSuccess() ) repaint();
53                 }
54         };
55         /**
56          *      {@link MidiDeviceFrame} が閉じられたり、選択されたりしたときに再描画するリスナー
57          */
58         public final InternalFrameListener midiDeviceFrameListener = new InternalFrameAdapter() {
59                 @Override
60                 public void internalFrameActivated(InternalFrameEvent e) {
61                         JInternalFrame frame = e.getInternalFrame();
62                         if( ! (frame instanceof MidiDeviceFrame ) ) return;
63                         setSelectionPath(((MidiDeviceFrame)frame).getMidiTransceiverListView().getModel().getTreePath());
64                 }
65                 @Override
66                 public void internalFrameClosing(InternalFrameEvent e) { repaint(); }
67         };
68         @Override
69         public MidiDeviceTreeModel getModel() { return (MidiDeviceTreeModel) super.getModel(); }
70         /**
71          * MIDIデバイスツリービューを構築します。
72          * @param model このビューにデータを提供するモデル
73          */
74         public MidiDeviceTreeView(MidiDeviceTreeModel model) {
75                 super(model);
76                 (new DragSource()).createDefaultDragGestureRecognizer(
77                         this, DnDConstants.ACTION_COPY_OR_MOVE, new DragGestureListener() {
78                                 @Override
79                                 public void dragGestureRecognized(DragGestureEvent dge) {
80                                         if( (dge.getDragAction() & DnDConstants.ACTION_COPY_OR_MOVE) == 0 ) return;
81                                         Point origin = dge.getDragOrigin();
82                                         Object leaf = getPathForLocation(origin.x, origin.y).getLastPathComponent();
83                                         if( ! (leaf instanceof MidiTransceiverListModel) ) return;
84                                         draggingObject.trxListModel = (MidiTransceiverListModel)leaf;
85                                         dge.startDrag(DragSource.DefaultMoveDrop, draggingObject, dragSourceListener);
86                                 }
87                         }
88                 );
89                 setCellRenderer(new DefaultTreeCellRenderer() {
90                         @Override
91                         public Component getTreeCellRendererComponent(JTree tree, Object value,
92                                         boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)
93                         {
94                                 super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
95                                 setToolTipText(value.toString());
96                                 if(leaf) {
97                                         MidiTransceiverListModel deviceModel = (MidiTransceiverListModel)value;
98                                         if( deviceModel.getMidiDevice().isOpen() ) {
99                                                 setDisabledIcon(MidiTransceiverListView.MIDI_CONNECTER_ICON);
100                                                 setEnabled(false);
101                                                 setToolTipText(getToolTipText()+"はすでに開いています");
102                                         } else {
103                                                 setIcon(MidiTransceiverListView.MIDI_CONNECTER_ICON);
104                                                 setEnabled(true);
105                                                 setToolTipText("ドラッグ&ドロップで"+getToolTipText()+"が開きます");
106                                         }
107                                 }
108                                 return this;
109                         }
110                 });
111                 // ツリーノードを開き、ルートを選択した状態にする
112                 for( int row = 0; row < getRowCount() ; row++ ) expandRow(row);
113                 //
114                 // ツリーノードのToolTipを有効化
115                 ToolTipManager.sharedInstance().registerComponent(this);
116
117         }
118 }