*/
public static class VersionInfo {
public static final String NAME = "MIDI Chord Helper";
- public static final String VERSION = "Ver.20160628.1";
+ public static final String VERSION = "Ver.20160629.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/";
/**
* {@link Transmitter}または{@link Receiver}のリストを表す{@link javax.swing.ListModel}の基底抽象クラス
*/
-public abstract class TransceiverListModel<E> extends AbstractListModel<E> {
- public TransceiverListModel(MidiDeviceModel deviceModel) {
+public abstract class AbstractTransceiverListModel<E> extends AbstractListModel<E> {
+ public AbstractTransceiverListModel(MidiDeviceModel deviceModel) {
this.deviceModel = deviceModel;
}
protected MidiDeviceModel deviceModel;
/**
* MIDIレシーバ({@link Receiver})またはMIDIトランスミッタ({@link Transmitter})のリストを表示する基底の抽象リストビューです。
*/
-public abstract class TransceiverListView<E> extends JList<E> {
+public abstract class AbstractTransceiverListView<E> extends JList<E> {
/**
* このリストによって表示されるリストを保持するデータモデルを返します。
* @return 表示されるリストを提供するデータモデル
*/
@Override
- public TransceiverListModel<E> getModel() {
- return (TransceiverListModel<E>) super.getModel();
+ public AbstractTransceiverListModel<E> getModel() {
+ return (AbstractTransceiverListModel<E>) super.getModel();
}
/**
* このリストの座標系内の指定された位置にある要素を返します。
* 仮想MIDI端子リストビューを生成します。
* @param model このビューから参照されるデータモデル
*/
- public TransceiverListView(TransceiverListModel<E> model) {
+ public AbstractTransceiverListView(AbstractTransceiverListModel<E> model) {
super(model);
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
setLayoutOrientation(JList.HORIZONTAL_WRAP);
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Stroke;
-import java.awt.dnd.DragSourceAdapter;
-import java.awt.dnd.DragSourceDragEvent;
-import java.awt.dnd.DragSourceDropEvent;
-import java.awt.dnd.DragSourceListener;
-import java.awt.dnd.DragSourceMotionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
static DraggingTransceiver dragging = new DraggingTransceiver();
private Point draggingPoint;
/**
- * ドラッグしている最中に再描画するためのソースモーションリスナー
+ * ドラッグ中の場所を更新し、再描画を予約します。
+ * @param p ドラッグ中の場所(ドラッグ&ドロップ終了時はnullを指定)
*/
- public final DragSourceMotionListener dragSourceMotionListener = new DragSourceMotionListener() {
- @Override
- public void dragMouseMoved(DragSourceDragEvent dsde) {
- setDraggingLocation(dsde.getLocation());
+ public void updateDraggingLocation(Point p) {
+ if( (draggingPoint = p) == null ) {
+ dragging.setData(null);
+ } else {
+ Point origin = getLocationOnScreen();
+ draggingPoint.translate(-origin.x, -origin.y);
}
- };
- 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) {
- MidiCablePane.this.dragDropEnd();
- }
- };
- public void dragDropEnd() {
- dragging.setData(null);
- draggingPoint = null;
repaint();
}
/**
/**
* {@link Receiver} のリストを表す {@link javax.swing.ListModel}
*/
-public class ReceiverListModel extends TransceiverListModel<Receiver> {
+public class ReceiverListModel extends AbstractTransceiverListModel<Receiver> {
public ReceiverListModel(MidiDeviceModel deviceModel) { super(deviceModel); }
protected List<Receiver> getTransceivers() {
return deviceModel.getMidiDevice().getReceivers();
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
+import java.awt.dnd.DragSourceAdapter;
+import java.awt.dnd.DragSourceDragEvent;
+import java.awt.dnd.DragSourceDropEvent;
+import java.awt.dnd.DragSourceMotionListener;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDragEvent;
/**
* MIDIレシーバ({@link Receiver})のリストビューです。
- * レシーバをこのビューからドラッグし、
- * {@link TransmitterListView} のトランスミッタにドロップして接続できます。
*/
-public class ReceiverListView extends TransceiverListView<Receiver> {
+public class ReceiverListView extends AbstractTransceiverListView<Receiver> {
/**
* このリストによって表示される{@link Receiver}のリストを保持するデータモデルを返します。
* @return 表示される{@link Receiver}のリストを提供するデータモデル
return this;
}
});
+ // ドラッグ
DragSource dragSource = new DragSource();
DragGestureListener dgl = new DragGestureListener() {
@Override
public void dragGestureRecognized(DragGestureEvent event) {
if( (event.getDragAction() & DnDConstants.ACTION_COPY_OR_MOVE) == 0 ) return;
MidiCablePane.dragging.setData(getElementAt(event.getDragOrigin()));
- event.startDrag(DragSource.DefaultLinkDrop, MidiCablePane.dragging, cablePane.dragSourceListener);
+ event.startDrag(DragSource.DefaultLinkDrop, MidiCablePane.dragging, new DragSourceAdapter() {
+ @Override
+ public void dragDropEnd(DragSourceDropEvent dsde) {
+ cablePane.updateDraggingLocation(null);
+ }
+ });
}
};
dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY_OR_MOVE, dgl);
- dragSource.addDragSourceMotionListener(cablePane.dragSourceMotionListener);
- //
- // 外からドラッグされたトランスミッタを、ドロップした場所のレシーバに接続する
+ dragSource.addDragSourceMotionListener(new DragSourceMotionListener() {
+ @Override
+ public void dragMouseMoved(DragSourceDragEvent dsde) {
+ cablePane.updateDraggingLocation(dsde.getLocation());
+ }
+ });
+ // ドロップ
DropTargetListener dtl = new DropTargetAdapter() {
@Override
public void dragEnter(DropTargetDragEvent event) {
/**
* {@link Transmitter} のリストを表す {@link javax.swing.ListModel}
*/
-public class TransmitterListModel extends TransceiverListModel<Transmitter> {
+public class TransmitterListModel extends AbstractTransceiverListModel<Transmitter> {
public TransmitterListModel(MidiDeviceModel deviceModel) { super(deviceModel); }
protected List<Transmitter> getTransceivers() {
return deviceModel.getMidiDevice().getTransmitters();
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceAdapter;
+import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
+import java.awt.dnd.DragSourceMotionListener;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDragEvent;
/**
* MIDIトランスミッタ({@link Transmitter})のリストビューです。
- * トランスミッタをこのビューからドラッグし、
- * {@link ReceiverListView} のレシーバにドロップして接続できます。
*/
-public class TransmitterListView extends TransceiverListView<Transmitter> {
+public class TransmitterListView extends AbstractTransceiverListView<Transmitter> {
/**
* このリストによって表示される{@link Transmitter}のリストを保持するデータモデルを返します。
* @return 表示される{@link Transmitter}のリストを提供するデータモデル
return this;
}
});
+ // ドラッグ
DragSource dragSource = new DragSource();
DragGestureListener dgl = new DragGestureListener() {
@Override
exception.printStackTrace();
}
}
- cablePane.dragSourceListener.dragDropEnd(event);
+ cablePane.updateDraggingLocation(null);
}
});
}
};
dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY_OR_MOVE, dgl);
- dragSource.addDragSourceMotionListener(cablePane.dragSourceMotionListener);
- //
- // 外からドラッグされたレシーバを、ドロップした場所のトランスミッタに接続する
+ dragSource.addDragSourceMotionListener(new DragSourceMotionListener() {
+ @Override
+ public void dragMouseMoved(DragSourceDragEvent dsde) {
+ cablePane.updateDraggingLocation(dsde.getLocation());
+ }
+ });
+ // ドロップ
DropTargetListener dtl = new DropTargetAdapter() {
@Override
public void dragEnter(DropTargetDragEvent event) {