/**
* 実体のない新規Transmitterを表すインターフェース
*/
- public interface NewTransmitter extends Transmitter {
- /**
- * 収容先のリストモデルを返します。
- *
- * @return 収容先のリストモデル
- */
- public MidiConnecterListModel getMidiConnecterListModel();
- };
+ public interface NewTransmitter extends Transmitter {};
public NewTransmitter newTransmitter = new NewTransmitter() {
@Override
- public MidiConnecterListModel getMidiConnecterListModel() {
- return MidiConnecterListModel.this;
- }
- @Override
public void setReceiver(Receiver receiver) { }
@Override
public Receiver getReceiver() { return null; }
}
}
/**
- * å¼\95æ\95°ã\81§æ\8c\87å®\9aã\81\95ã\82\8cã\81\9fã\83\88ã\83©ã\83³ã\82¹ã\83\9fã\83\83ã\82¿ã\82\92ã\80\81æ\9c\80å\88\9dã\81®ã\83¬ã\82·ã\83¼ã\83\90ã\81«接続します。
+ * å¼\95æ\95°ã\81§æ\8c\87å®\9aã\81\95ã\82\8cã\81\9fã\83\88ã\83©ã\83³ã\82¹ã\83\9fã\83\83ã\82¿ã\82\92ã\83¬ã\82·ã\83¼ã\83\90ã\82\92接続します。
* @param tx トランスミッタ
- * @return 接続されたレシーバ(見つからなかった場合はnull)
+ * @param rx レシーバ
+ * @return 接続されたレシーバ(このリストにないレシーバが指定された場合はnull)
*/
- public Receiver ConnectToReceiver(Transmitter tx) {
- List<Receiver> receivers = device.getReceivers();
- if( receivers.isEmpty() ) return null;
- Receiver rx = receivers.get(0);
+ public Receiver ConnectToReceiver(Transmitter tx, Receiver rx) {
+ if( ! device.getReceivers().contains(rx) ) return null;
tx.setReceiver(rx);
fireContentsChanged(this,0,getSize());
return rx;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
+import java.awt.dnd.DragSourceDragEvent;
+import java.awt.dnd.DragSourceDropEvent;
+import java.awt.dnd.DragSourceEvent;
+import java.awt.dnd.DragSourceListener;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
* </p>
*/
public class MidiConnecterListView extends JList<AutoCloseable>
- implements Transferable, DragGestureListener, DropTargetListener
+ implements DragGestureListener, DragSourceListener, Transferable, DropTargetListener
{
public static final Icon MIDI_CONNECTER_ICON =
new ButtonIcon(ButtonIcon.MIDI_CONNECTOR_ICON);
) {
String text;
if( value instanceof Receiver ) text = "Rx";
- else if( value == null || value instanceof Transmitter ) text = null;
+ else if( value instanceof Transmitter ) text = "Tx";
+ else if( value == null ) text = null;
else text = value.toString();
setText(text);
setIcon(MIDI_CONNECTER_ICON);
);
new DropTarget( this, DnDConstants.ACTION_COPY_OR_MOVE, this, true );
}
+
+ @Override
+ public void dragGestureRecognized(DragGestureEvent dge) {
+ if( (dge.getDragAction() & DnDConstants.ACTION_COPY_OR_MOVE) == 0 ) return;
+ AutoCloseable e = getModel().getElementAt(locationToIndex(dge.getDragOrigin()));
+ if( e instanceof Transmitter ) {
+ if( e instanceof MidiConnecterListModel.NewTransmitter ) {
+ transferringTx = getModel().getTransmitter();
+ }
+ else {
+ transferringTx = (Transmitter)e;
+ }
+ dge.startDrag(DragSource.DefaultLinkDrop, this, this);
+ }
+ }
+
+ @Override
+ public void dragEnter(DragSourceDragEvent dsde) {}
+ @Override
+ public void dragOver(DragSourceDragEvent dsde) {}
+ @Override
+ public void dropActionChanged(DragSourceDragEvent dsde) {}
+ @Override
+ public void dragExit(DragSourceEvent dse) {}
+ @Override
+ public void dragDropEnd(DragSourceDropEvent dsde) {
+ if( ! dsde.getDropSuccess() ) getModel().closeTransmitter(transferringTx);
+ transferringTx = null;
+ }
+
+ private Transmitter transferringTx = null;
private static final DataFlavor transmitterFlavor =
new DataFlavor(Transmitter.class, "Transmitter");
private static final DataFlavor transmitterFlavors[] = {transmitterFlavor};
@Override
- public Object getTransferData(DataFlavor flavor) {
- return getModel().getElementAt(getSelectedIndex());
- }
+ public Object getTransferData(DataFlavor flavor) { return transferringTx; }
@Override
- public DataFlavor[] getTransferDataFlavors() {
- return transmitterFlavors;
- }
+ public DataFlavor[] getTransferDataFlavors() { return transmitterFlavors; }
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.equals(transmitterFlavor);
}
- @Override
- public void dragGestureRecognized(DragGestureEvent dge) {
- int action = dge.getDragAction();
- if( (action & DnDConstants.ACTION_COPY_OR_MOVE) == 0 )
- return;
- int index = locationToIndex(dge.getDragOrigin());
- AutoCloseable data = getModel().getElementAt(index);
- if( data instanceof Transmitter ) {
- dge.startDrag(DragSource.DefaultLinkDrop, this, null);
- }
- }
+
@Override
public void dragEnter(DropTargetDragEvent event) {
if( event.isDataFlavorSupported(transmitterFlavor) )
event.dropComplete(false);
return;
}
- Transferable t = event.getTransferable();
- Object data = t.getTransferData(transmitterFlavor);
- Transmitter newTransmitter = null;
- if( data instanceof MidiConnecterListModel.NewTransmitter ) {
- newTransmitter = ((MidiConnecterListModel.NewTransmitter)data).getMidiConnecterListModel().getTransmitter();
- }
- else if( data instanceof Transmitter ) {
- newTransmitter = (Transmitter)data;
- }
- else {
+ AutoCloseable destination = getModel().getElementAt(locationToIndex(event.getLocation()));
+ if( ! (destination instanceof Receiver) ) {
event.dropComplete(false);
return;
}
- if( getModel().ConnectToReceiver(newTransmitter) == null ) {
- newTransmitter.close();
+ Transmitter sourceTx = (Transmitter)event.getTransferable().getTransferData(transmitterFlavor);
+ if( getModel().ConnectToReceiver(sourceTx, (Receiver)destination) == null ) {
event.dropComplete(false);
+ return;
}
event.dropComplete(true);
}
package camidion.chordhelper.mididevice;
-import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.sound.midi.MidiDevice;
import javax.swing.BoxLayout;
-import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
* MIDIデバイスフレームビュー
*/
public class MidiDeviceFrame extends JInternalFrame {
- private static Insets ZERO_INSETS = new Insets(0,0,0,0);
/**
* デバイスの仮想MIDI端子リストビュー
*/
setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
add(new JScrollPane(listView));
add(new JPanel() {{
- if( listView.getModel().txSupported() ) {
- add(new JButton("Close Tx") {{
- setMargin(ZERO_INSETS);
- addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent event) {
- listView.closeSelectedTransmitter();
- }
- });
- }});
- }
add(new JLabel() {{
timer = new Timer(50, new ActionListener() {
private long sec = -2;
});
}});
}});
- setSize(250,100);
}
/**
* 指定されたインデックスが示す仮想MIDI端子リストの要素のセル範囲を返します。