*/
public static class VersionInfo {
public static final String NAME = "MIDI Chord Helper";
- public static final String VERSION = "Ver.20160709.1";
+ public static final String VERSION = "Ver.20160712.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/";
import java.awt.Component;
import java.awt.Point;
import java.awt.Rectangle;
+import java.awt.datatransfer.DataFlavor;
import javax.sound.midi.Receiver;
import javax.sound.midi.Transmitter;
*/
protected abstract String toolTipTextFor(E element);
/**
+ * 要素型を表すデータフレーバーの配列を返します。
+ */
+ public abstract DataFlavor[] getElementDataFlavorArray();
+ /**
* 仮想MIDI端子リストビューを生成します。
* @param model このビューから参照されるデータモデル
*/
* ドラッグ中の{@link Transmitter}または{@link Receiver}を
* {@link Transferable}インターフェースで参照できるようにするクラス
*/
- public class DraggingTransceiver implements Transferable {
+ public class DraggingTransceiver<E> implements Transferable {
private DataFlavor[] draggingFlavors;
- public DraggingTransceiver(Object source, DataFlavor flavor) {
- (draggingFlavors = new DataFlavor[1])[0] = flavor;
- draggingSource = source;
+ public DraggingTransceiver(AbstractTransceiverListView<E> listView) {
+ draggingFlavors = listView.getElementDataFlavorArray();
+ draggingSource = listView.getSelectedValue();
repaint();
}
@Override
* ドラッグ&ドロップ中のケーブル描画情報を
* {@link MidiCablePane}クラスのインスタンスに提供するための{@link TransferHandler}
*/
- public abstract class TransceiverTransferHandler extends TransferHandler {
+ public abstract class TransceiverTransferHandler<E> extends TransferHandler {
+ private AbstractTransceiverListView<E> listView;
+ private DataFlavor destinationDataFlavor;
+ public TransceiverTransferHandler(AbstractTransceiverListView<E> listView, DataFlavor destinationDataFlavor) {
+ this.listView = listView;
+ this.destinationDataFlavor = destinationDataFlavor;
+ }
@Override
public int getSourceActions(JComponent compo) { return COPY_OR_MOVE; }
@Override
+ protected Transferable createTransferable(JComponent compo) {
+ return new DraggingTransceiver<E>(listView);
+ }
+ @Override
protected void exportDone(JComponent source, Transferable data, int action) {
draggingSource = null;
draggingLocation = null;
- setDestinationTransceiver(null);
+ draggingDestination = null;
+ repaint();
}
- protected void setDestinationTransceiver(Object destination) {
- draggingDestination = destination;
+ @Override
+ public boolean canImport(TransferSupport support) {
+ if( ! support.isDrop() ) return false;
+ if( ! support.isDataFlavorSupported(destinationDataFlavor) ) {
+ draggingDestination = null;
+ repaint();
+ return false;
+ }
+ draggingDestination = listView.getElementAt(support.getDropLocation().getDropPoint());
repaint();
+ return true;
+ }
+ public DataFlavor getDestinationDataFlavor() {
+ return destinationDataFlavor;
}
}
/**
+ * ドラッグ中、ドロップできるエリアを外れたとき、この描画面に通知します。
+ */
+ public void draggedOutOfDestination() {
+ draggingDestination = null;
+ repaint();
+ }
+ /**
* {@link MidiDeviceFrame} が移動または変形したときにケーブルを再描画するためのリスナー
*/
public final ComponentListener midiDeviceFrameComponentListener = new ComponentAdapter() {
import javax.swing.JInternalFrame;
import javax.swing.JLayeredPane;
import javax.swing.JOptionPane;
+import javax.swing.TransferHandler;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreePath;
toY += 50;
}
}
- setTransferHandler(cablePane.new TransceiverTransferHandler() {
+ setTransferHandler(new TransferHandler() {
@Override
public boolean canImport(TransferSupport support) {
if( ! support.isDrop() ) return false;
return true;
}
if( support.isDataFlavorSupported(TransmitterListView.transmitterFlavor) ) {
- setDestinationTransceiver(null);
+ cablePane.draggedOutOfDestination();
// Transmitterの切り離しができるよう、ドロップを容認
return true;
}
if( support.isDataFlavorSupported(ReceiverListView.receiverFlavor) ) {
- setDestinationTransceiver(null);
+ cablePane.draggedOutOfDestination();
// Receiverはドロップ不可
}
return false;
package camidion.chordhelper.mididevice;
import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
import javax.sound.midi.Receiver;
import javax.sound.midi.Transmitter;
-import javax.swing.JComponent;
/**
* {@link Receiver}のリストビュー
*/
public class ReceiverListView extends AbstractTransceiverListView<Receiver> {
public static final DataFlavor receiverFlavor = new DataFlavor(Receiver.class,"Receiver");
+ public static final DataFlavor[] receiverFlavorArray = {receiverFlavor};
+ @Override
+ public DataFlavor[] getElementDataFlavorArray() { return receiverFlavorArray; }
@Override
protected String toolTipTextFor(Receiver rx) {
return "受信端子(Rx):ドラッグ&ドロップしてTxに接続できます。";
*/
public ReceiverListView(ReceiverListModel model, MidiCablePane cablePane) {
super(model);
- setTransferHandler(cablePane.new TransceiverTransferHandler() {
- @Override
- protected Transferable createTransferable(JComponent compo) {
- return cablePane.new DraggingTransceiver(getSelectedValue(),receiverFlavor);
- }
- @Override
- public boolean canImport(TransferSupport support) {
- if( ! support.isDrop() ) return false;
- if( ! support.isDataFlavorSupported(TransmitterListView.transmitterFlavor) ) {
- setDestinationTransceiver(null);
- return false;
- }
- setDestinationTransceiver(getElementAt(support.getDropLocation().getDropPoint()));
- return true;
- }
+ setTransferHandler(cablePane.new TransceiverTransferHandler<Receiver>(this,TransmitterListView.transmitterFlavor) {
@Override
public boolean importData(TransferSupport support) {
try {
- Transmitter tx = (Transmitter)support.getTransferable().getTransferData(TransmitterListView.transmitterFlavor);
+ Transmitter tx = (Transmitter)support.getTransferable().getTransferData(getDestinationDataFlavor());
tx.setReceiver(getElementAt(support.getDropLocation().getDropPoint()));
return true;
} catch (Exception exception) {
*/
public class TransmitterListView extends AbstractTransceiverListView<Transmitter> {
public static final DataFlavor transmitterFlavor = new DataFlavor(Transmitter.class,"Transmitter");
+ public static final DataFlavor[] transmitterFlavorArray = {transmitterFlavor};
+ @Override
+ public DataFlavor[] getElementDataFlavorArray() { return transmitterFlavorArray; }
@Override
protected String toolTipTextFor(Transmitter tx) {
if( tx instanceof DummyTransmitter ) {
*/
public TransmitterListView(TransmitterListModel model, MidiCablePane cablePane) {
super(model);
- setTransferHandler(cablePane.new TransceiverTransferHandler() {
- @Override
- protected Transferable createTransferable(JComponent compo) {
- return cablePane.new DraggingTransceiver(getSelectedValue(),transmitterFlavor);
- }
+ setTransferHandler(cablePane.new TransceiverTransferHandler<Transmitter>(this, ReceiverListView.receiverFlavor) {
@Override
protected void exportDone(JComponent source, Transferable data, int action) {
if( data != null ) {
super.exportDone(source, data, action);
}
@Override
- public boolean canImport(TransferSupport support) {
- if( ! support.isDrop() ) return false;
- if( ! support.isDataFlavorSupported(ReceiverListView.receiverFlavor) ) {
- setDestinationTransceiver(null);
- return false;
- }
- setDestinationTransceiver(getElementAt(support.getDropLocation().getDropPoint()));
- return true;
- }
- @Override
public boolean importData(TransferSupport support) {
try {
- Receiver rx = (Receiver)support.getTransferable().getTransferData(ReceiverListView.receiverFlavor);
+ Receiver rx = (Receiver)support.getTransferable().getTransferData(getDestinationDataFlavor());
Transmitter tx = getElementAt(support.getDropLocation().getDropPoint());
if( tx instanceof DummyTransmitter ) tx = getModel().openTransmitter();
tx.setReceiver(rx);