*/
public static class VersionInfo {
public static final String NAME = "MIDI Chord Helper";
- public static final String VERSION = "Ver.20160629.1";
+ public static final String VERSION = "Ver.20160630.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/";
package camidion.chordhelper.mididevice;
+import java.awt.Component;
import java.awt.Point;
import java.awt.Rectangle;
*/
public abstract class AbstractTransceiverListView<E> extends JList<E> {
/**
- * ã\81\93ã\81®ã\83ªã\82¹ã\83\88によって表示されるリストを保持するデータモデルを返します。
+ * ã\81\93ã\81®ã\83\93ã\83¥ã\83¼によって表示されるリストを保持するデータモデルを返します。
* @return 表示されるリストを提供するデータモデル
*/
@Override
return getCellBounds(index,index);
}
/**
+ * 指定された要素のツールチップに表示する文字列を返します。
+ * @param element 要素
+ * @return ツールチップ文字列
+ */
+ protected abstract String toolTipTextFor(E element);
+ /**
* 仮想MIDI端子リストビューを生成します。
* @param model このビューから参照されるデータモデル
*/
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
setLayoutOrientation(JList.HORIZONTAL_WRAP);
setVisibleRowCount(0);
+ setCellRenderer(new TransceiverListCellRenderer<E>() {
+ public Component getListCellRendererComponent(JList<? extends E> list,
+ E value, int index, boolean isSelected, boolean cellHasFocus)
+ {
+ super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+ setToolTipText(toolTipTextFor(value));
+ return this;
+ }
+ });
}
}
package camidion.chordhelper.mididevice;
-import java.awt.Component;
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;
/**
- * MIDIレシーバ({@link Receiver})のリストビューです。
+ * {@link Receiver}のリストビュー
*/
public class ReceiverListView extends AbstractTransceiverListView<Receiver> {
- /**
- * このリストによって表示される{@link Receiver}のリストを保持するデータモデルを返します。
- * @return 表示される{@link Receiver}のリストを提供するデータモデル
- */
@Override
public ReceiverListModel getModel() { return (ReceiverListModel) super.getModel(); }
+ @Override
+ protected String toolTipTextFor(Receiver rx) {
+ return "受信端子(Rx):ドラッグ&ドロップしてTxに接続できます。";
+ }
/**
* 仮想MIDI端子リストビューを生成します。
* @param model このビューから参照されるデータモデル
*/
public ReceiverListView(ReceiverListModel model, MidiCablePane cablePane) {
super(model);
- setCellRenderer(new TransceiverListCellRenderer<Receiver>() {
- public Component getListCellRendererComponent(JList<? extends Receiver> list,
- Receiver value, int index, boolean isSelected, boolean cellHasFocus)
- {
- super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
- setToolTipText("受信端子(Rx):ドラッグ&ドロップしてTxに接続できます。");
- return this;
- }
- });
- // ドラッグ
+ setupDrag(cablePane);
+ setupDrop();
+ }
+ /**
+ * {@link Receiver}をドラッグできるようにします。
+ * @param cablePane MIDIケーブル描画面
+ */
+ private void setupDrag(MidiCablePane cablePane) {
DragSource dragSource = new DragSource();
DragGestureListener dgl = new DragGestureListener() {
@Override
cablePane.updateDraggingLocation(dsde.getLocation());
}
});
- // ドロップ
+ }
+ /**
+ * {@link Transmitter}のドロップを受け付けます。
+ */
+ private void setupDrop() {
DropTargetListener dtl = new DropTargetAdapter() {
@Override
public void dragEnter(DropTargetDragEvent event) {
}
/**
* 新しい{@link Transmitter}を{@link MidiDevice#getTransmitter}で生成し、
- * このモデルを参照しているビューに通知します。
+ * 要素数が1個増えたことをこのモデルを参照しているビューへ通知します。
*
* @return 未接続の{@link Transmitter}
* @throws MidiUnavailableException リソースの制約のためにトランスミッタを使用できない場合にスローされる
*/
public Transmitter openTransmitter() throws MidiUnavailableException {
+ int index = getTransceivers().size();
Transmitter tx = deviceModel.getMidiDevice().getTransmitter();
- fireIntervalAdded(this, 0, getSize());
+ fireIntervalAdded(this, index, index);
return tx;
}
/**
deviceModel.getTransmitterListModel().openTransmitter().setReceiver(rxList.get(0));
}
/**
- * 指定の{@link Transmitter}を閉じ、要素が減ったことを、
- * このモデルを参照しているビューに通知します。
+ * 指定の{@link Transmitter}を閉じ、要素数が1個減ったことをこのモデルを参照しているビューへ通知します。
*
* @param tx このリストモデルで開いている{@link Transmitter}
*/
public void closeTransmitter(Transmitter tx) {
+ int index = indexOf(tx);
tx.close();
- fireIntervalRemoved(this, 0, getSize());
+ fireIntervalRemoved(this, index, index);
}
/**
* このリストモデルにある{@link Transmitter}のうち、
package camidion.chordhelper.mididevice;
-import java.awt.Component;
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;
/**
- * MIDIトランスミッタ({@link Transmitter})のリストビューです。
+ * {@link Transmitter}のリストビュー
*/
public class TransmitterListView extends AbstractTransceiverListView<Transmitter> {
- /**
- * このリストによって表示される{@link Transmitter}のリストを保持するデータモデルを返します。
- * @return 表示される{@link Transmitter}のリストを提供するデータモデル
- */
@Override
public TransmitterListModel getModel() { return (TransmitterListModel) super.getModel(); }
+ @Override
+ protected String toolTipTextFor(Transmitter tx) {
+ if( tx instanceof DummyTransmitter ) {
+ return "未接続の送信端子(Tx):ドラッグ&ドロップしてRxに接続できます。";
+ } else {
+ return "接続済の送信端子(Tx):ドラッグ&ドロップして接続先Rxを変更、または切断できます。";
+ }
+ }
/**
* 仮想MIDI端子リストビューを生成します。
* @param model このビューから参照されるデータモデル
*/
public TransmitterListView(TransmitterListModel model, MidiCablePane cablePane) {
super(model);
- setCellRenderer(new TransceiverListCellRenderer<Transmitter>() {
- @Override
- public Component getListCellRendererComponent(JList<? extends Transmitter> list,
- Transmitter value, int index, boolean isSelected, boolean cellHasFocus)
- {
- super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
- if( value instanceof DummyTransmitter ) {
- setToolTipText("未接続の送信端子(Tx):ドラッグ&ドロップしてRxに接続できます。");
- } else {
- setToolTipText("接続済の送信端子(Tx):ドラッグ&ドロップして接続先Rxを変更、または切断できます。");
- }
- return this;
- }
- });
- // ドラッグ
+ setupDrag(cablePane);
+ setupDrop();
+ }
+ /**
+ * {@link Transmitter}をドラッグできるようにします。
+ * @param cablePane MIDIケーブル描画面
+ */
+ private void setupDrag(MidiCablePane cablePane) {
DragSource dragSource = new DragSource();
DragGestureListener dgl = new DragGestureListener() {
@Override
cablePane.updateDraggingLocation(dsde.getLocation());
}
});
- // ドロップ
+ }
+ /**
+ * {@link Receiver}のドロップを受け付けます。
+ */
+ private void setupDrop() {
DropTargetListener dtl = new DropTargetAdapter() {
@Override
public void dragEnter(DropTargetDragEvent event) {