From: Akiyoshi Kamide Date: Tue, 28 Jun 2016 17:26:10 +0000 (+0900) Subject: リファクタリング:MIDIデバイスのListView/ListModel関連のクラス階層を最適化 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=b837c0a89afc2df4e4cef94f699d7f9478ba1e12;p=midichordhelper%2FMIDIChordHelper.git リファクタリング:MIDIデバイスのListView/ListModel関連のクラス階層を最適化 --- diff --git a/src/camidion/chordhelper/ChordHelperApplet.java b/src/camidion/chordhelper/ChordHelperApplet.java index edd9b93..85d7d36 100644 --- a/src/camidion/chordhelper/ChordHelperApplet.java +++ b/src/camidion/chordhelper/ChordHelperApplet.java @@ -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/"; diff --git a/src/camidion/chordhelper/mididevice/MidiCablePane.java b/src/camidion/chordhelper/mididevice/MidiCablePane.java index a6710bc..c0d9152 100644 --- a/src/camidion/chordhelper/mididevice/MidiCablePane.java +++ b/src/camidion/chordhelper/mididevice/MidiCablePane.java @@ -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} が移動または変形したときにケーブルを再描画するためのリスナー */ diff --git a/src/camidion/chordhelper/mididevice/ReceiverListModel.java b/src/camidion/chordhelper/mididevice/ReceiverListModel.java index 32ed91f..967738a 100644 --- a/src/camidion/chordhelper/mididevice/ReceiverListModel.java +++ b/src/camidion/chordhelper/mididevice/ReceiverListModel.java @@ -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 { - 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 { + public ReceiverListModel(MidiDeviceModel deviceModel) { super(deviceModel); } + protected List getTransceivers() { + return deviceModel.getMidiDevice().getReceivers(); } /** * {@link Receiver}を最大1個開きます。 diff --git a/src/camidion/chordhelper/mididevice/ReceiverListView.java b/src/camidion/chordhelper/mididevice/ReceiverListView.java index 670f4bf..c4d727d 100644 --- a/src/camidion/chordhelper/mididevice/ReceiverListView.java +++ b/src/camidion/chordhelper/mididevice/ReceiverListView.java @@ -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 { +public class ReceiverListView extends TransceiverListView { /** * このリストによって表示される{@link Receiver}のリストを保持するデータモデルを返します。 * @return 表示される{@link Receiver}のリストを提供するデータモデル @@ -31,24 +29,12 @@ public class ReceiverListView extends JList { @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() { public Component getListCellRendererComponent(JList list, Receiver value, int index, boolean isSelected, boolean cellHasFocus) @@ -63,8 +49,7 @@ public class ReceiverListView extends JList { @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 { 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 index 0000000..fa32725 --- /dev/null +++ b/src/camidion/chordhelper/mididevice/TransceiverListModel.java @@ -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 extends AbstractListModel { + public TransceiverListModel(MidiDeviceModel deviceModel) { + this.deviceModel = deviceModel; + } + protected MidiDeviceModel deviceModel; + protected abstract List 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 index 0000000..ae195c0 --- /dev/null +++ b/src/camidion/chordhelper/mididevice/TransceiverListView.java @@ -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 extends JList { + /** + * このリストによって表示されるリストを保持するデータモデルを返します。 + * @return 表示されるリストを提供するデータモデル + */ + @Override + public TransceiverListModel getModel() { + return (TransceiverListModel) 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 model) { + super(model); + setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + setLayoutOrientation(JList.HORIZONTAL_WRAP); + setVisibleRowCount(0); + } +} diff --git a/src/camidion/chordhelper/mididevice/TransmitterListModel.java b/src/camidion/chordhelper/mididevice/TransmitterListModel.java index f29ba5f..c5421b2 100644 --- a/src/camidion/chordhelper/mididevice/TransmitterListModel.java +++ b/src/camidion/chordhelper/mididevice/TransmitterListModel.java @@ -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 { - protected MidiDeviceModel deviceModel; - public TransmitterListModel(MidiDeviceModel deviceModel) { this.deviceModel = deviceModel; } +public class TransmitterListModel extends TransceiverListModel { + public TransmitterListModel(MidiDeviceModel deviceModel) { super(deviceModel); } + protected List getTransceivers() { + return deviceModel.getMidiDevice().getTransmitters(); + } private Transmitter dummyTx = new DummyTransmitter(); @Override public Transmitter getElementAt(int index) { - List txList = deviceModel.getMidiDevice().getTransmitters(); + List 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 txList = deviceModel.getMidiDevice().getTransmitters(); + List txList = getTransceivers(); return dummyTx.equals(element) ? txList.size() : txList.indexOf(element); } /** @@ -74,7 +74,7 @@ public class TransmitterListModel extends AbstractListModel { */ public void closePeerTransmitterOf(Receiver rx) { List closingTxList = new Vector(); - List txList = deviceModel.getMidiDevice().getTransmitters(); + List txList = getTransceivers(); for( Transmitter tx : txList ) if( tx.getReceiver() == rx ) closingTxList.add(tx); if( closingTxList.isEmpty() ) return; int length = getSize(); diff --git a/src/camidion/chordhelper/mididevice/TransmitterListView.java b/src/camidion/chordhelper/mididevice/TransmitterListView.java index 2d35e49..13299dc 100644 --- a/src/camidion/chordhelper/mididevice/TransmitterListView.java +++ b/src/camidion/chordhelper/mididevice/TransmitterListView.java @@ -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 { +public class TransmitterListView extends TransceiverListView { /** * このリストによって表示される{@link Transmitter}のリストを保持するデータモデルを返します。 * @return 表示される{@link Transmitter}のリストを提供するデータモデル @@ -33,24 +31,12 @@ public class TransmitterListView extends JList { @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() { @Override public Component getListCellRendererComponent(JList list, @@ -70,8 +56,7 @@ public class TransmitterListView extends JList { @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 { 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);