OSDN Git Service

MIDI Device画面の改良
authorAkiyoshi Kamide <kamide@yk.rim.or.jp>
Mon, 2 May 2016 17:04:50 +0000 (02:04 +0900)
committerAkiyoshi Kamide <kamide@yk.rim.or.jp>
Mon, 2 May 2016 17:04:50 +0000 (02:04 +0900)
・Rx以外にドロップしたときにTxが閉じるようにした
・CloseTxボタンの廃止

src/camidion/chordhelper/ChordHelperApplet.java
src/camidion/chordhelper/mididevice/MidiConnecterListModel.java
src/camidion/chordhelper/mididevice/MidiConnecterListView.java
src/camidion/chordhelper/mididevice/MidiDeviceFrame.java

index 8f7e09a..7c565ae 100644 (file)
@@ -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/";
index 196f69b..8b9c074 100644 (file)
@@ -19,20 +19,9 @@ public class MidiConnecterListModel extends AbstractListModel<AutoCloseable> {
        /**
         * 実体のない新規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<AutoCloseable> {
                }
        }
        /**
-        * å¼\95æ\95°ã\81§æ\8c\87å®\9aã\81\95ã\82\8cã\81\9fã\83\88ã\83©ã\83³ã\82¹ã\83\9fã\83\83ã\82¿ã\82\92ã\80\81æ\9c\80å\88\9dã\81®ã\83¬ã\82·ã\83¼ã\83\90ã\81«接続します。
+        * å¼\95æ\95°ã\81§æ\8c\87å®\9aã\81\95ã\82\8cã\81\9fã\83\88ã\83©ã\83³ã\82¹ã\83\9fã\83\83ã\82¿ã\82\92ã\83¬ã\82·ã\83¼ã\83\90ã\82\92接続します。
         * @param tx トランスミッタ
-        * @return 接続されたレシーバ(見つからなかった場合はnull)
+        * @param rx レシーバ
+        * @return 接続されたレシーバ(このリストにないレシーバが指定された場合はnull)
         */
-       public Receiver ConnectToReceiver(Transmitter tx) {
-               List<Receiver> 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;
index 08cf11e..9922bdf 100644 (file)
@@ -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;
  * </p>
  */
 public class MidiConnecterListView extends JList<AutoCloseable>
-       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<AutoCloseable>
                ) {
                        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<AutoCloseable>
         );
                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<AutoCloseable>
                                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);
                }
index 0a30604..5c97aab 100644 (file)
@@ -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端子リストの要素のセル範囲を返します。