OSDN Git Service

リファクタリング:MIDIデバイスのListView/ListModel関連のクラス階層を最適化
authorAkiyoshi Kamide <kamide@yk.rim.or.jp>
Tue, 28 Jun 2016 17:26:10 +0000 (02:26 +0900)
committerAkiyoshi Kamide <kamide@yk.rim.or.jp>
Tue, 28 Jun 2016 17:26:10 +0000 (02:26 +0900)
src/camidion/chordhelper/ChordHelperApplet.java
src/camidion/chordhelper/mididevice/MidiCablePane.java
src/camidion/chordhelper/mididevice/ReceiverListModel.java
src/camidion/chordhelper/mididevice/ReceiverListView.java
src/camidion/chordhelper/mididevice/TransceiverListModel.java [new file with mode: 0644]
src/camidion/chordhelper/mididevice/TransceiverListView.java [new file with mode: 0644]
src/camidion/chordhelper/mididevice/TransmitterListModel.java
src/camidion/chordhelper/mididevice/TransmitterListView.java

index edd9b93..85d7d36 100644 (file)
@@ -285,7 +285,7 @@ public class ChordHelperApplet extends JApplet {
         */
        public static class VersionInfo {
                public static final String      NAME = "MIDI Chord Helper";
-               public static final String      VERSION = "Ver.20160623.1";
+               public static final String      VERSION = "Ver.20160628.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 a6710bc..c0d9152 100644 (file)
@@ -42,24 +42,29 @@ public class MidiCablePane extends JComponent {
        public final DragSourceMotionListener dragSourceMotionListener = new DragSourceMotionListener() {
                @Override
                public void dragMouseMoved(DragSourceDragEvent dsde) {
-                       Point origin = getLocationOnScreen();
-                       draggingPoint = dsde.getLocation();
-                       draggingPoint.translate(-origin.x, -origin.y);
-                       repaint();
+                       setDraggingLocation(dsde.getLocation());
                }
-
        };
+       public void setDraggingLocation(Point p) {
+               Point origin = getLocationOnScreen();
+               draggingPoint = p;
+               draggingPoint.translate(-origin.x, -origin.y);
+               repaint();
+       }
        /**
         * ドラッグ終了時に再描画するためのソースリスナー
         */
        public final DragSourceListener dragSourceListener = new DragSourceAdapter() {
                @Override
                public void dragDropEnd(DragSourceDropEvent dsde) {
-                       dragging.setData(null);
-                       draggingPoint = null;
-                       repaint();
+                       MidiCablePane.this.dragDropEnd();
                }
        };
+       public void dragDropEnd() {
+               dragging.setData(null);
+               draggingPoint = null;
+               repaint();
+       }
        /**
         * {@link MidiDeviceFrame} が移動または変形したときにケーブルを再描画するためのリスナー
         */
index 32ed91f..967738a 100644 (file)
@@ -6,24 +6,14 @@ import javax.sound.midi.MidiDevice;
 import javax.sound.midi.MidiUnavailableException;
 import javax.sound.midi.Receiver;
 import javax.sound.midi.Transmitter;
-import javax.swing.AbstractListModel;
 
 /**
  * {@link Receiver} のリストを表す {@link javax.swing.ListModel}
  */
-public class ReceiverListModel extends AbstractListModel<Receiver> {
-       protected MidiDeviceModel deviceModel;
-       public ReceiverListModel(MidiDeviceModel deviceModel) { this.deviceModel = deviceModel; }
-       @Override
-       public Receiver getElementAt(int index) {
-               return deviceModel.getMidiDevice().getReceivers().get(index);
-       }
-       @Override
-       public int getSize() {
-               return deviceModel.getMidiDevice().getReceivers().size();
-       }
-       public int indexOf(Object element) {
-               return deviceModel.getMidiDevice().getReceivers().indexOf(element);
+public class ReceiverListModel extends TransceiverListModel<Receiver> {
+       public ReceiverListModel(MidiDeviceModel deviceModel) { super(deviceModel); }
+       protected List<Receiver> getTransceivers() {
+               return deviceModel.getMidiDevice().getReceivers();
        }
        /**
         * {@link Receiver}を最大1個開きます。
index 670f4bf..c4d727d 100644 (file)
@@ -1,7 +1,6 @@
 package camidion.chordhelper.mididevice;
 
 import java.awt.Component;
-import java.awt.Rectangle;
 import java.awt.datatransfer.Transferable;
 import java.awt.dnd.DnDConstants;
 import java.awt.dnd.DragGestureEvent;
@@ -16,14 +15,13 @@ import java.awt.dnd.DropTargetListener;
 import javax.sound.midi.Receiver;
 import javax.sound.midi.Transmitter;
 import javax.swing.JList;
-import javax.swing.ListSelectionModel;
 
 /**
  * MIDIレシーバ({@link Receiver})のリストビューです。
  * レシーバをこのビューからドラッグし、
  * {@link TransmitterListView} のトランスミッタにドロップして接続できます。
  */
-public class ReceiverListView extends JList<Receiver> {
+public class ReceiverListView extends TransceiverListView<Receiver> {
        /**
         * このリストによって表示される{@link Receiver}のリストを保持するデータモデルを返します。
         * @return 表示される{@link Receiver}のリストを提供するデータモデル
@@ -31,24 +29,12 @@ public class ReceiverListView extends JList<Receiver> {
        @Override
        public ReceiverListModel getModel() { return (ReceiverListModel) super.getModel(); }
        /**
-        * 引数で指定された{@link Receiver}のセル範囲を示す、
-        * リストの座標系内の境界の矩形を返します。対応するセルがない場合はnullを返します。
-        * @return セル範囲を示す境界の矩形、またはnull
-        */
-       public Rectangle getCellBounds(Receiver rx) {
-               int index = getModel().indexOf(rx);
-               return getCellBounds(index,index);
-       }
-       /**
         * 仮想MIDI端子リストビューを生成します。
         * @param model このビューから参照されるデータモデル
         * @param cablePane MIDIケーブル描画面
         */
        public ReceiverListView(ReceiverListModel model, MidiCablePane cablePane) {
                super(model);
-               setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-               setLayoutOrientation(JList.HORIZONTAL_WRAP);
-               setVisibleRowCount(0);
                setCellRenderer(new TransceiverListCellRenderer<Receiver>() {
                        public Component getListCellRendererComponent(JList<? extends Receiver> list,
                                        Receiver value, int index, boolean isSelected, boolean cellHasFocus)
@@ -63,8 +49,7 @@ public class ReceiverListView extends JList<Receiver> {
                        @Override
                        public void dragGestureRecognized(DragGestureEvent event) {
                                if( (event.getDragAction() & DnDConstants.ACTION_COPY_OR_MOVE) == 0 ) return;
-                               Receiver rx = getModel().getElementAt(locationToIndex(event.getDragOrigin()));
-                               MidiCablePane.dragging.setData(rx);
+                               MidiCablePane.dragging.setData(getElementAt(event.getDragOrigin()));
                                event.startDrag(DragSource.DefaultLinkDrop, MidiCablePane.dragging, cablePane.dragSourceListener);
                        }
                };
@@ -94,7 +79,7 @@ public class ReceiverListView extends JList<Receiver> {
                                try {
                                        Object tx = t.getTransferData(DraggingTransceiver.transmitterFlavor);
                                        if( tx != null ) {
-                                               ((Transmitter)tx).setReceiver(getModel().getElementAt(locationToIndex(event.getLocation())));
+                                               ((Transmitter)tx).setReceiver(getElementAt(event.getLocation()));
                                                event.dropComplete(true);
                                                return;
                                        }
diff --git a/src/camidion/chordhelper/mididevice/TransceiverListModel.java b/src/camidion/chordhelper/mididevice/TransceiverListModel.java
new file mode 100644 (file)
index 0000000..fa32725
--- /dev/null
@@ -0,0 +1,29 @@
+package camidion.chordhelper.mididevice;
+
+import java.util.List;
+
+import javax.sound.midi.Receiver;
+import javax.sound.midi.Transmitter;
+import javax.swing.AbstractListModel;
+
+/**
+ * {@link Transmitter}または{@link Receiver}のリストを表す{@link javax.swing.ListModel}の基底抽象クラス
+ */
+public abstract class TransceiverListModel<E> extends AbstractListModel<E> {
+       public TransceiverListModel(MidiDeviceModel deviceModel) {
+               this.deviceModel = deviceModel;
+       }
+       protected MidiDeviceModel deviceModel;
+       protected abstract List<E> getTransceivers();
+       @Override
+       public E getElementAt(int index) { return getTransceivers().get(index); }
+       @Override
+       public int getSize() { return getTransceivers().size(); }
+       /**
+        * 引数で指定された要素({@link Transmitter}または{@link Receiver})の位置を返します。
+        *
+        * @param element 要素
+        * @return 位置(0が先頭、見つからない場合 -1)
+        */
+       public int indexOf(Object element) { return getTransceivers().indexOf(element); }
+}
diff --git a/src/camidion/chordhelper/mididevice/TransceiverListView.java b/src/camidion/chordhelper/mididevice/TransceiverListView.java
new file mode 100644 (file)
index 0000000..ae195c0
--- /dev/null
@@ -0,0 +1,50 @@
+package camidion.chordhelper.mididevice;
+
+import java.awt.Point;
+import java.awt.Rectangle;
+
+import javax.sound.midi.Receiver;
+import javax.sound.midi.Transmitter;
+import javax.swing.JList;
+import javax.swing.ListSelectionModel;
+
+/**
+ * MIDIレシーバ({@link Receiver})またはMIDIトランスミッタ({@link Transmitter})のリストを表示する基底の抽象リストビューです。
+ */
+public abstract class TransceiverListView<E> extends JList<E> {
+       /**
+        * このリストによって表示されるリストを保持するデータモデルを返します。
+        * @return 表示されるリストを提供するデータモデル
+        */
+       @Override
+       public TransceiverListModel<E> getModel() {
+               return (TransceiverListModel<E>) super.getModel();
+       }
+       /**
+        * このリストの座標系内の指定された位置にある要素を返します。
+        * @param p 位置
+        */
+       public E getElementAt(Point p) {
+               return getModel().getElementAt(locationToIndex(p));
+       }
+       /**
+        * 引数で指定された{@link Receiver}または{@link Transmitter}のセル範囲を示す、
+        * リストの座標系内の境界の矩形を返します。対応するセルがない場合はnullを返します。
+        * @param trx {@link Receiver}または{@link Transmitter}
+        * @return セル範囲を示す境界の矩形、またはnull
+        */
+       public Rectangle getCellBounds(E trx) {
+               int index = getModel().indexOf(trx);
+               return getCellBounds(index,index);
+       }
+       /**
+        * 仮想MIDI端子リストビューを生成します。
+        * @param model このビューから参照されるデータモデル
+        */
+       public TransceiverListView(TransceiverListModel<E> model) {
+               super(model);
+               setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+               setLayoutOrientation(JList.HORIZONTAL_WRAP);
+               setVisibleRowCount(0);
+       }
+}
index f29ba5f..c5421b2 100644 (file)
@@ -8,29 +8,29 @@ import javax.sound.midi.MidiUnavailableException;
 import javax.sound.midi.Receiver;
 import javax.sound.midi.Sequencer;
 import javax.sound.midi.Transmitter;
-import javax.swing.AbstractListModel;
 
 /**
  * {@link Transmitter} のリストを表す {@link javax.swing.ListModel}
  */
-public class TransmitterListModel extends AbstractListModel<Transmitter> {
-       protected MidiDeviceModel deviceModel;
-       public TransmitterListModel(MidiDeviceModel deviceModel) { this.deviceModel = deviceModel; }
+public class TransmitterListModel extends TransceiverListModel<Transmitter> {
+       public TransmitterListModel(MidiDeviceModel deviceModel) { super(deviceModel); }
+       protected List<Transmitter> getTransceivers() {
+               return deviceModel.getMidiDevice().getTransmitters();
+       }
        private Transmitter dummyTx = new DummyTransmitter();
        @Override
        public Transmitter getElementAt(int index) {
-               List<Transmitter> txList = deviceModel.getMidiDevice().getTransmitters();
+               List<Transmitter> txList = getTransceivers();
                int length = txList.size();
                if( index == length ) return dummyTx;
                if( index > length || index < 0 ) return null;
                return txList.get(index);
        }
        @Override
-       public int getSize() {
-               return deviceModel.getMidiDevice().getTransmitters().size() + 1;
-       }
+       public int getSize() { return super.getSize() + 1; }
+       @Override
        public int indexOf(Object element) {
-               List<Transmitter> txList = deviceModel.getMidiDevice().getTransmitters();
+               List<Transmitter> txList = getTransceivers();
                return dummyTx.equals(element) ? txList.size() : txList.indexOf(element);
        }
        /**
@@ -74,7 +74,7 @@ public class TransmitterListModel extends AbstractListModel<Transmitter> {
         */
        public void closePeerTransmitterOf(Receiver rx) {
                List<Transmitter> closingTxList = new Vector<Transmitter>();
-               List<Transmitter> txList = deviceModel.getMidiDevice().getTransmitters();
+               List<Transmitter> txList = getTransceivers();
                for( Transmitter tx : txList ) if( tx.getReceiver() == rx ) closingTxList.add(tx);
                if( closingTxList.isEmpty() ) return;
                int length = getSize();
index 2d35e49..13299dc 100644 (file)
@@ -1,7 +1,6 @@
 package camidion.chordhelper.mididevice;
 
 import java.awt.Component;
-import java.awt.Rectangle;
 import java.awt.datatransfer.Transferable;
 import java.awt.dnd.DnDConstants;
 import java.awt.dnd.DragGestureEvent;
@@ -18,14 +17,13 @@ import java.awt.dnd.DropTargetListener;
 import javax.sound.midi.Receiver;
 import javax.sound.midi.Transmitter;
 import javax.swing.JList;
-import javax.swing.ListSelectionModel;
 
 /**
  * MIDIトランスミッタ({@link Transmitter})のリストビューです。
  * トランスミッタをこのビューからドラッグし、
  * {@link ReceiverListView} のレシーバにドロップして接続できます。
  */
-public class TransmitterListView extends JList<Transmitter> {
+public class TransmitterListView extends TransceiverListView<Transmitter> {
        /**
         * このリストによって表示される{@link Transmitter}のリストを保持するデータモデルを返します。
         * @return 表示される{@link Transmitter}のリストを提供するデータモデル
@@ -33,24 +31,12 @@ public class TransmitterListView extends JList<Transmitter> {
        @Override
        public TransmitterListModel getModel() { return (TransmitterListModel) super.getModel(); }
        /**
-        * 引数で指定された{@link Transmitter}のセル範囲を示す、
-        * リストの座標系内の境界の矩形を返します。対応するセルがない場合はnullを返します。
-        * @return セル範囲を示す境界の矩形、またはnull
-        */
-       public Rectangle getCellBounds(Transmitter tx) {
-               int index = getModel().indexOf(tx);
-               return getCellBounds(index,index);
-       }
-       /**
         * 仮想MIDI端子リストビューを生成します。
         * @param model このビューから参照されるデータモデル
         * @param cablePane MIDIケーブル描画面
         */
        public TransmitterListView(TransmitterListModel model, MidiCablePane cablePane) {
                super(model);
-               setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-               setLayoutOrientation(JList.HORIZONTAL_WRAP);
-               setVisibleRowCount(0);
                setCellRenderer(new TransceiverListCellRenderer<Transmitter>() {
                        @Override
                        public Component getListCellRendererComponent(JList<? extends Transmitter> list,
@@ -70,8 +56,7 @@ public class TransmitterListView extends JList<Transmitter> {
                        @Override
                        public void dragGestureRecognized(DragGestureEvent event) {
                                if( (event.getDragAction() & DnDConstants.ACTION_COPY_OR_MOVE) == 0 ) return;
-                               Transmitter tx = getModel().getElementAt(locationToIndex(event.getDragOrigin()));
-                               MidiCablePane.dragging.setData(tx);
+                               MidiCablePane.dragging.setData(getElementAt(event.getDragOrigin()));
                                event.startDrag(DragSource.DefaultLinkDrop, MidiCablePane.dragging, new DragSourceAdapter() {
                                        @Override
                                        public void dragDropEnd(DragSourceDropEvent event) {
@@ -118,7 +103,7 @@ public class TransmitterListView extends JList<Transmitter> {
                                try {
                                        Object rx = t.getTransferData(DraggingTransceiver.receiverFlavor);
                                        if( rx != null ) {
-                                               Transmitter tx = getModel().getElementAt(locationToIndex(event.getLocation()));
+                                               Transmitter tx = getElementAt(event.getLocation());
                                                if( tx instanceof DummyTransmitter ) tx = getModel().openTransmitter();
                                                tx.setReceiver((Receiver)rx);
                                                event.dropComplete(true);