1 package camidion.chordhelper.mididevice;
3 import java.awt.Component;
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;
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;
27 public class MidiDeviceTreeView extends JTree {
29 public static final DataFlavor LIST_MODEL_FLAVOR = new DataFlavor(ListModel.class,"ListModel");
31 public class DraggingObject implements Transferable {
32 private DataFlavor flavors[] = {LIST_MODEL_FLAVOR};
33 private MidiTransceiverListModel trxListModel;
35 public Object getTransferData(DataFlavor flavor) {
36 return flavor.getRepresentationClass().isInstance(trxListModel) ? trxListModel : null;
39 public DataFlavor[] getTransferDataFlavors() { return flavors; }
41 public boolean isDataFlavorSupported(DataFlavor flavor) {
42 return flavors[0].equals(flavor);
45 private DraggingObject draggingObject = new DraggingObject();
47 * このツリーからドラッグしたMIDIデバイスのドロップが成功したときに再描画するためのリスナー
49 private DragSourceListener dragSourceListener = new DragSourceAdapter() {
51 public void dragDropEnd(DragSourceDropEvent dsde) {
52 if( dsde.getDropSuccess() ) repaint();
56 * {@link MidiDeviceFrame} が閉じられたり、選択されたりしたときに再描画するリスナー
58 public final InternalFrameListener midiDeviceFrameListener = new InternalFrameAdapter() {
60 public void internalFrameActivated(InternalFrameEvent e) {
61 JInternalFrame frame = e.getInternalFrame();
62 if( ! (frame instanceof MidiDeviceFrame ) ) return;
63 setSelectionPath(((MidiDeviceFrame)frame).getMidiTransceiverListView().getModel().getTreePath());
66 public void internalFrameClosing(InternalFrameEvent e) { repaint(); }
69 public MidiDeviceTreeModel getModel() { return (MidiDeviceTreeModel) super.getModel(); }
71 * MIDIデバイスツリービューを構築します。
72 * @param model このビューにデータを提供するモデル
74 public MidiDeviceTreeView(MidiDeviceTreeModel model) {
76 (new DragSource()).createDefaultDragGestureRecognizer(
77 this, DnDConstants.ACTION_COPY_OR_MOVE, new DragGestureListener() {
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);
89 setCellRenderer(new DefaultTreeCellRenderer() {
91 public Component getTreeCellRendererComponent(JTree tree, Object value,
92 boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)
94 super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
95 setToolTipText(value.toString());
97 MidiTransceiverListModel deviceModel = (MidiTransceiverListModel)value;
98 if( deviceModel.getMidiDevice().isOpen() ) {
99 setDisabledIcon(MidiTransceiverListView.MIDI_CONNECTER_ICON);
101 setToolTipText(getToolTipText()+"はすでに開いています");
103 setIcon(MidiTransceiverListView.MIDI_CONNECTER_ICON);
105 setToolTipText("ドラッグ&ドロップで"+getToolTipText()+"が開きます");
111 // ツリーノードを開き、ルートを選択した状態にする
112 for( int row = 0; row < getRowCount() ; row++ ) expandRow(row);
114 // ツリーノードのToolTipを有効化
115 ToolTipManager.sharedInstance().registerComponent(this);