From: Akiyoshi Kamide Date: Mon, 2 May 2016 17:04:50 +0000 (+0900) Subject: MIDI Device画面の改良 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=e9744c5ae8897b52c0bd06ed598c6c67589de808;p=midichordhelper%2FMIDIChordHelper.git MIDI Device画面の改良 ・Rx以外にドロップしたときにTxが閉じるようにした ・CloseTxボタンの廃止 --- diff --git a/src/camidion/chordhelper/ChordHelperApplet.java b/src/camidion/chordhelper/ChordHelperApplet.java index 8f7e09a..7c565ae 100644 --- a/src/camidion/chordhelper/ChordHelperApplet.java +++ b/src/camidion/chordhelper/ChordHelperApplet.java @@ -284,7 +284,7 @@ public class ChordHelperApplet extends JApplet { */ public static class VersionInfo { public static final String NAME = "MIDI Chord Helper"; - public static final String VERSION = "Ver.20160501.1"; + public static final String VERSION = "Ver.20160502.1"; public static final String COPYRIGHT = "Copyright (C) 2004-2016"; public static final String AUTHER = "@きよし - Akiyoshi Kamide"; public static final String URL = "http://www.yk.rim.or.jp/~kamide/music/chordhelper/"; diff --git a/src/camidion/chordhelper/mididevice/MidiConnecterListModel.java b/src/camidion/chordhelper/mididevice/MidiConnecterListModel.java index 196f69b..8b9c074 100644 --- a/src/camidion/chordhelper/mididevice/MidiConnecterListModel.java +++ b/src/camidion/chordhelper/mididevice/MidiConnecterListModel.java @@ -19,20 +19,9 @@ public class MidiConnecterListModel extends AbstractListModel { /** * 実体のない新規Transmitterを表すインターフェース */ - public interface NewTransmitter extends Transmitter { - /** - * 収容先のリストモデルを返します。 - * - * @return 収容先のリストモデル - */ - public MidiConnecterListModel getMidiConnecterListModel(); - }; + public interface NewTransmitter extends Transmitter {}; public NewTransmitter newTransmitter = new NewTransmitter() { @Override - public MidiConnecterListModel getMidiConnecterListModel() { - return MidiConnecterListModel.this; - } - @Override public void setReceiver(Receiver receiver) { } @Override public Receiver getReceiver() { return null; } @@ -134,14 +123,13 @@ public class MidiConnecterListModel extends AbstractListModel { } } /** - * 引数で指定されたトランスミッタを、最初のレシーバに接続します。 + * 引数で指定されたトランスミッタをレシーバを接続します。 * @param tx トランスミッタ - * @return 接続されたレシーバ(見つからなかった場合はnull) + * @param rx レシーバ + * @return 接続されたレシーバ(このリストにないレシーバが指定された場合はnull) */ - public Receiver ConnectToReceiver(Transmitter tx) { - List receivers = device.getReceivers(); - if( receivers.isEmpty() ) return null; - Receiver rx = receivers.get(0); + public Receiver ConnectToReceiver(Transmitter tx, Receiver rx) { + if( ! device.getReceivers().contains(rx) ) return null; tx.setReceiver(rx); fireContentsChanged(this,0,getSize()); return rx; diff --git a/src/camidion/chordhelper/mididevice/MidiConnecterListView.java b/src/camidion/chordhelper/mididevice/MidiConnecterListView.java index 08cf11e..9922bdf 100644 --- a/src/camidion/chordhelper/mididevice/MidiConnecterListView.java +++ b/src/camidion/chordhelper/mididevice/MidiConnecterListView.java @@ -7,6 +7,10 @@ import java.awt.dnd.DnDConstants; import java.awt.dnd.DragGestureEvent; import java.awt.dnd.DragGestureListener; import java.awt.dnd.DragSource; +import java.awt.dnd.DragSourceDragEvent; +import java.awt.dnd.DragSourceDropEvent; +import java.awt.dnd.DragSourceEvent; +import java.awt.dnd.DragSourceListener; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; @@ -31,7 +35,7 @@ import camidion.chordhelper.ButtonIcon; *

*/ public class MidiConnecterListView extends JList - implements Transferable, DragGestureListener, DropTargetListener + implements DragGestureListener, DragSourceListener, Transferable, DropTargetListener { public static final Icon MIDI_CONNECTER_ICON = new ButtonIcon(ButtonIcon.MIDI_CONNECTOR_ICON); @@ -45,7 +49,8 @@ public class MidiConnecterListView extends JList ) { String text; if( value instanceof Receiver ) text = "Rx"; - else if( value == null || value instanceof Transmitter ) text = null; + else if( value instanceof Transmitter ) text = "Tx"; + else if( value == null ) text = null; else text = value.toString(); setText(text); setIcon(MIDI_CONNECTER_ICON); @@ -77,32 +82,49 @@ public class MidiConnecterListView extends JList ); new DropTarget( this, DnDConstants.ACTION_COPY_OR_MOVE, this, true ); } + + @Override + public void dragGestureRecognized(DragGestureEvent dge) { + if( (dge.getDragAction() & DnDConstants.ACTION_COPY_OR_MOVE) == 0 ) return; + AutoCloseable e = getModel().getElementAt(locationToIndex(dge.getDragOrigin())); + if( e instanceof Transmitter ) { + if( e instanceof MidiConnecterListModel.NewTransmitter ) { + transferringTx = getModel().getTransmitter(); + } + else { + transferringTx = (Transmitter)e; + } + dge.startDrag(DragSource.DefaultLinkDrop, this, this); + } + } + + @Override + public void dragEnter(DragSourceDragEvent dsde) {} + @Override + public void dragOver(DragSourceDragEvent dsde) {} + @Override + public void dropActionChanged(DragSourceDragEvent dsde) {} + @Override + public void dragExit(DragSourceEvent dse) {} + @Override + public void dragDropEnd(DragSourceDropEvent dsde) { + if( ! dsde.getDropSuccess() ) getModel().closeTransmitter(transferringTx); + transferringTx = null; + } + + private Transmitter transferringTx = null; private static final DataFlavor transmitterFlavor = new DataFlavor(Transmitter.class, "Transmitter"); private static final DataFlavor transmitterFlavors[] = {transmitterFlavor}; @Override - public Object getTransferData(DataFlavor flavor) { - return getModel().getElementAt(getSelectedIndex()); - } + public Object getTransferData(DataFlavor flavor) { return transferringTx; } @Override - public DataFlavor[] getTransferDataFlavors() { - return transmitterFlavors; - } + public DataFlavor[] getTransferDataFlavors() { return transmitterFlavors; } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { return flavor.equals(transmitterFlavor); } - @Override - public void dragGestureRecognized(DragGestureEvent dge) { - int action = dge.getDragAction(); - if( (action & DnDConstants.ACTION_COPY_OR_MOVE) == 0 ) - return; - int index = locationToIndex(dge.getDragOrigin()); - AutoCloseable data = getModel().getElementAt(index); - if( data instanceof Transmitter ) { - dge.startDrag(DragSource.DefaultLinkDrop, this, null); - } - } + @Override public void dragEnter(DropTargetDragEvent event) { if( event.isDataFlavorSupported(transmitterFlavor) ) @@ -123,22 +145,15 @@ public class MidiConnecterListView extends JList event.dropComplete(false); return; } - Transferable t = event.getTransferable(); - Object data = t.getTransferData(transmitterFlavor); - Transmitter newTransmitter = null; - if( data instanceof MidiConnecterListModel.NewTransmitter ) { - newTransmitter = ((MidiConnecterListModel.NewTransmitter)data).getMidiConnecterListModel().getTransmitter(); - } - else if( data instanceof Transmitter ) { - newTransmitter = (Transmitter)data; - } - else { + AutoCloseable destination = getModel().getElementAt(locationToIndex(event.getLocation())); + if( ! (destination instanceof Receiver) ) { event.dropComplete(false); return; } - if( getModel().ConnectToReceiver(newTransmitter) == null ) { - newTransmitter.close(); + Transmitter sourceTx = (Transmitter)event.getTransferable().getTransferData(transmitterFlavor); + if( getModel().ConnectToReceiver(sourceTx, (Receiver)destination) == null ) { event.dropComplete(false); + return; } event.dropComplete(true); } diff --git a/src/camidion/chordhelper/mididevice/MidiDeviceFrame.java b/src/camidion/chordhelper/mididevice/MidiDeviceFrame.java index 0a30604..5c97aab 100644 --- a/src/camidion/chordhelper/mididevice/MidiDeviceFrame.java +++ b/src/camidion/chordhelper/mididevice/MidiDeviceFrame.java @@ -1,13 +1,11 @@ package camidion.chordhelper.mididevice; -import java.awt.Insets; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.sound.midi.MidiDevice; import javax.swing.BoxLayout; -import javax.swing.JButton; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JPanel; @@ -20,7 +18,6 @@ import javax.swing.event.InternalFrameEvent; * MIDIデバイスフレームビュー */ public class MidiDeviceFrame extends JInternalFrame { - private static Insets ZERO_INSETS = new Insets(0,0,0,0); /** * デバイスの仮想MIDI端子リストビュー */ @@ -64,17 +61,6 @@ public class MidiDeviceFrame extends JInternalFrame { setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); add(new JScrollPane(listView)); add(new JPanel() {{ - if( listView.getModel().txSupported() ) { - add(new JButton("Close Tx") {{ - setMargin(ZERO_INSETS); - addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - listView.closeSelectedTransmitter(); - } - }); - }}); - } add(new JLabel() {{ timer = new Timer(50, new ActionListener() { private long sec = -2; @@ -94,7 +80,6 @@ public class MidiDeviceFrame extends JInternalFrame { }); }}); }}); - setSize(250,100); } /** * 指定されたインデックスが示す仮想MIDI端子リストの要素のセル範囲を返します。