*/
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/";
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} が移動または変形したときにケーブルを再描画するためのリスナー
*/
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個開きます。
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;
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}のリストを提供するデータモデル
@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)
@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);
}
};
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;
}
--- /dev/null
+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); }
+}
--- /dev/null
+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);
+ }
+}
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);
}
/**
*/
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();
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;
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}のリストを提供するデータモデル
@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,
@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) {
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);