OSDN Git Service

リファクタリング
authorAkiyoshi Kamide <kamide@yk.rim.or.jp>
Tue, 12 Jul 2016 16:03:32 +0000 (01:03 +0900)
committerAkiyoshi Kamide <kamide@yk.rim.or.jp>
Tue, 12 Jul 2016 16:03:32 +0000 (01:03 +0900)
src/camidion/chordhelper/ChordHelperApplet.java
src/camidion/chordhelper/mididevice/AbstractTransceiverListView.java
src/camidion/chordhelper/mididevice/MidiCablePane.java
src/camidion/chordhelper/mididevice/MidiOpenedDevicesView.java
src/camidion/chordhelper/mididevice/ReceiverListView.java
src/camidion/chordhelper/mididevice/TransmitterListView.java

index 05f7da7..3767e28 100644 (file)
@@ -283,7 +283,7 @@ public class ChordHelperApplet extends JApplet {
         */
        public static class VersionInfo {
                public static final String      NAME = "MIDI Chord Helper";
-               public static final String      VERSION = "Ver.20160709.1";
+               public static final String      VERSION = "Ver.20160712.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 9def514..0496299 100644 (file)
@@ -3,6 +3,7 @@ package camidion.chordhelper.mididevice;
 import java.awt.Component;
 import java.awt.Point;
 import java.awt.Rectangle;
+import java.awt.datatransfer.DataFlavor;
 
 import javax.sound.midi.Receiver;
 import javax.sound.midi.Transmitter;
@@ -46,6 +47,10 @@ public abstract class AbstractTransceiverListView<E> extends JList<E> {
         */
        protected abstract String toolTipTextFor(E element);
        /**
+        * 要素型を表すデータフレーバーの配列を返します。
+        */
+       public abstract DataFlavor[] getElementDataFlavorArray();
+       /**
         * 仮想MIDI端子リストビューを生成します。
         * @param model このビューから参照されるデータモデル
         */
index a565ab3..7d037c0 100644 (file)
@@ -43,11 +43,11 @@ public class MidiCablePane extends JComponent {
         * ドラッグ中の{@link Transmitter}または{@link Receiver}を
         * {@link Transferable}インターフェースで参照できるようにするクラス
         */
-       public class DraggingTransceiver implements Transferable {
+       public class DraggingTransceiver<E> implements Transferable {
                private DataFlavor[] draggingFlavors;
-               public DraggingTransceiver(Object source, DataFlavor flavor) {
-                       (draggingFlavors = new DataFlavor[1])[0] = flavor;
-                       draggingSource = source;
+               public DraggingTransceiver(AbstractTransceiverListView<E> listView) {
+                       draggingFlavors = listView.getElementDataFlavorArray();
+                       draggingSource = listView.getSelectedValue();
                        repaint();
                }
                @Override
@@ -66,21 +66,50 @@ public class MidiCablePane extends JComponent {
         * ドラッグ&ドロップ中のケーブル描画情報を
         * {@link MidiCablePane}クラスのインスタンスに提供するための{@link TransferHandler}
         */
-       public abstract class TransceiverTransferHandler extends TransferHandler {
+       public abstract class TransceiverTransferHandler<E> extends TransferHandler {
+               private AbstractTransceiverListView<E> listView;
+               private DataFlavor destinationDataFlavor;
+               public TransceiverTransferHandler(AbstractTransceiverListView<E> listView, DataFlavor destinationDataFlavor) {
+                       this.listView = listView;
+                       this.destinationDataFlavor = destinationDataFlavor;
+               }
                @Override
                public int getSourceActions(JComponent compo) { return COPY_OR_MOVE; }
                @Override
+               protected Transferable createTransferable(JComponent compo) {
+                       return new DraggingTransceiver<E>(listView);
+               }
+               @Override
                protected void exportDone(JComponent source, Transferable data, int action) {
                        draggingSource = null;
                        draggingLocation = null;
-                       setDestinationTransceiver(null);
+                       draggingDestination = null;
+                       repaint();
                }
-               protected void setDestinationTransceiver(Object destination) {
-                       draggingDestination = destination;
+               @Override
+               public boolean canImport(TransferSupport support) {
+                       if( ! support.isDrop() ) return false;
+                       if( ! support.isDataFlavorSupported(destinationDataFlavor) ) {
+                               draggingDestination = null;
+                               repaint();
+                               return false;
+                       }
+                       draggingDestination = listView.getElementAt(support.getDropLocation().getDropPoint());
                        repaint();
+                       return true;
+               }
+               public DataFlavor getDestinationDataFlavor() {
+                       return destinationDataFlavor;
                }
        }
        /**
+        * ドラッグ中、ドロップできるエリアを外れたとき、この描画面に通知します。
+        */
+       public void draggedOutOfDestination() {
+               draggingDestination = null;
+               repaint();
+       }
+       /**
         * {@link MidiDeviceFrame} が移動または変形したときにケーブルを再描画するためのリスナー
         */
        public final ComponentListener midiDeviceFrameComponentListener = new ComponentAdapter() {
index 6fefccf..27304e8 100644 (file)
@@ -12,6 +12,7 @@ import javax.swing.JDesktopPane;
 import javax.swing.JInternalFrame;
 import javax.swing.JLayeredPane;
 import javax.swing.JOptionPane;
+import javax.swing.TransferHandler;
 import javax.swing.event.TreeSelectionEvent;
 import javax.swing.event.TreeSelectionListener;
 import javax.swing.tree.TreePath;
@@ -106,7 +107,7 @@ public class MidiOpenedDevicesView extends JDesktopPane implements TreeSelection
                                toY += 50;
                        }
                }
-               setTransferHandler(cablePane.new TransceiverTransferHandler() {
+               setTransferHandler(new TransferHandler() {
                        @Override
                        public boolean canImport(TransferSupport support) {
                                if( ! support.isDrop() ) return false;
@@ -115,12 +116,12 @@ public class MidiOpenedDevicesView extends JDesktopPane implements TreeSelection
                                        return true;
                                }
                                if( support.isDataFlavorSupported(TransmitterListView.transmitterFlavor) ) {
-                                       setDestinationTransceiver(null);
+                                       cablePane.draggedOutOfDestination();
                                        // Transmitterの切り離しができるよう、ドロップを容認
                                        return true;
                                }
                                if( support.isDataFlavorSupported(ReceiverListView.receiverFlavor) ) {
-                                       setDestinationTransceiver(null);
+                                       cablePane.draggedOutOfDestination();
                                        // Receiverはドロップ不可
                                }
                                return false;
index 2f6d9f5..773f72e 100644 (file)
@@ -1,17 +1,18 @@
 package camidion.chordhelper.mididevice;
 
 import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
 
 import javax.sound.midi.Receiver;
 import javax.sound.midi.Transmitter;
-import javax.swing.JComponent;
 
 /**
  * {@link Receiver}のリストビュー
  */
 public class ReceiverListView extends AbstractTransceiverListView<Receiver> {
        public static final DataFlavor receiverFlavor = new DataFlavor(Receiver.class,"Receiver");
+       public static final DataFlavor[] receiverFlavorArray = {receiverFlavor};
+       @Override
+       public DataFlavor[] getElementDataFlavorArray() { return receiverFlavorArray; }
        @Override
        protected String toolTipTextFor(Receiver rx) {
                return "受信端子(Rx):ドラッグ&ドロップしてTxに接続できます。";
@@ -25,25 +26,11 @@ public class ReceiverListView extends AbstractTransceiverListView<Receiver> {
         */
        public ReceiverListView(ReceiverListModel model, MidiCablePane cablePane) {
                super(model);
-               setTransferHandler(cablePane.new TransceiverTransferHandler() {
-                       @Override
-                       protected Transferable createTransferable(JComponent compo) {
-                               return cablePane.new DraggingTransceiver(getSelectedValue(),receiverFlavor);
-                       }
-                       @Override
-                       public boolean canImport(TransferSupport support) {
-                               if( ! support.isDrop() ) return false;
-                               if( ! support.isDataFlavorSupported(TransmitterListView.transmitterFlavor) ) {
-                                       setDestinationTransceiver(null);
-                                       return false;
-                               }
-                               setDestinationTransceiver(getElementAt(support.getDropLocation().getDropPoint()));
-                               return true;
-                       }
+               setTransferHandler(cablePane.new TransceiverTransferHandler<Receiver>(this,TransmitterListView.transmitterFlavor) {
                        @Override
                        public boolean importData(TransferSupport support) {
                                try {
-                                       Transmitter tx = (Transmitter)support.getTransferable().getTransferData(TransmitterListView.transmitterFlavor);
+                                       Transmitter tx = (Transmitter)support.getTransferable().getTransferData(getDestinationDataFlavor());
                                        tx.setReceiver(getElementAt(support.getDropLocation().getDropPoint()));
                                        return true;
                                } catch (Exception exception) {
index 7c94e66..e135102 100644 (file)
@@ -12,6 +12,9 @@ import javax.swing.JComponent;
  */
 public class TransmitterListView extends AbstractTransceiverListView<Transmitter> {
        public static final DataFlavor transmitterFlavor = new DataFlavor(Transmitter.class,"Transmitter");
+       public static final DataFlavor[] transmitterFlavorArray = {transmitterFlavor};
+       @Override
+       public DataFlavor[] getElementDataFlavorArray() { return transmitterFlavorArray; }
        @Override
        protected String toolTipTextFor(Transmitter tx) {
                if( tx instanceof DummyTransmitter ) {
@@ -29,11 +32,7 @@ public class TransmitterListView extends AbstractTransceiverListView<Transmitter
         */
        public TransmitterListView(TransmitterListModel model, MidiCablePane cablePane) {
                super(model);
-               setTransferHandler(cablePane.new TransceiverTransferHandler() {
-                       @Override
-                       protected Transferable createTransferable(JComponent compo) {
-                               return cablePane.new DraggingTransceiver(getSelectedValue(),transmitterFlavor);
-                       }
+               setTransferHandler(cablePane.new TransceiverTransferHandler<Transmitter>(this, ReceiverListView.receiverFlavor) {
                        @Override
                        protected void exportDone(JComponent source, Transferable data, int action) {
                                if( data != null ) {
@@ -53,19 +52,9 @@ public class TransmitterListView extends AbstractTransceiverListView<Transmitter
                                super.exportDone(source, data, action);
                        }
                        @Override
-                       public boolean canImport(TransferSupport support) {
-                               if( ! support.isDrop() ) return false;
-                               if( ! support.isDataFlavorSupported(ReceiverListView.receiverFlavor) ) {
-                                       setDestinationTransceiver(null);
-                                       return false;
-                               }
-                               setDestinationTransceiver(getElementAt(support.getDropLocation().getDropPoint()));
-                               return true;
-                       }
-                       @Override
                        public boolean importData(TransferSupport support) {
                                try {
-                                       Receiver rx = (Receiver)support.getTransferable().getTransferData(ReceiverListView.receiverFlavor);
+                                       Receiver rx = (Receiver)support.getTransferable().getTransferData(getDestinationDataFlavor());
                                        Transmitter tx = getElementAt(support.getDropLocation().getDropPoint());
                                        if( tx instanceof DummyTransmitter ) tx = getModel().openTransmitter();
                                        tx.setReceiver(rx);