From f7a63eeaad6992bb5bea3d8f24c5a0eaeb1dfa2c Mon Sep 17 00:00:00 2001 From: Akiyoshi Kamide Date: Thu, 5 May 2016 23:23:21 +0900 Subject: [PATCH] =?utf8?q?MIDI=E3=83=87=E3=83=90=E3=82=A4=E3=82=B9?= =?utf8?q?=E5=91=A8=E3=82=8A=E3=81=AE=E3=83=90=E3=82=B0=E4=BF=AE=E6=AD=A3?= =?utf8?q?=E3=81=AA=E3=81=A9=20=E3=83=BB=E5=BE=8C=E3=81=8B=E3=82=89?= =?utf8?q?=E9=96=8B=E3=81=84=E3=81=9FMIDI=E3=83=87=E3=83=90=E3=82=A4?= =?utf8?q?=E3=82=B9=E3=81=8C=E8=A6=8B=E3=81=88=E3=81=AA=E3=81=84=E5=95=8F?= =?utf8?q?=E9=A1=8C=E3=81=AB=E5=AF=BE=E5=BF=9C=EF=BC=88=E7=B8=A6=E3=82=B5?= =?utf8?q?=E3=82=A4=E3=82=BA0=E3=81=8C=E5=8E=9F=E5=9B=A0=EF=BC=89=20?= =?utf8?q?=E3=83=BB=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF=E3=83=AA?= =?utf8?q?=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/camidion/chordhelper/ChordHelperApplet.java | 4 +- .../chordhelper/mididevice/MidiCablePane.java | 8 +- .../mididevice/MidiConnecterListModel.java | 69 +++++-------- .../mididevice/MidiConnecterListView.java | 2 +- .../chordhelper/mididevice/MidiDeviceFrame.java | 49 ++++----- .../mididevice/MidiDeviceInOutType.java | 18 ++-- .../mididevice/MidiDeviceTreeModel.java | 23 ++--- .../chordhelper/mididevice/MidiDeviceTreeView.java | 3 +- .../mididevice/MidiOpenedDevicesView.java | 114 +++++++++++---------- 9 files changed, 135 insertions(+), 155 deletions(-) diff --git a/src/camidion/chordhelper/ChordHelperApplet.java b/src/camidion/chordhelper/ChordHelperApplet.java index 6655b64..d4cfe83 100644 --- a/src/camidion/chordhelper/ChordHelperApplet.java +++ b/src/camidion/chordhelper/ChordHelperApplet.java @@ -77,7 +77,7 @@ import camidion.chordhelper.pianokeyboard.PianoKeyboardAdapter; * (アプレットクラス) * * @auther - * Copyright (C) 2004-2014 @きよし - Akiyoshi Kamide + * Copyright (C) 2004-2016 @きよし - Akiyoshi Kamide * http://www.yk.rim.or.jp/~kamide/music/chordhelper/ */ public class ChordHelperApplet extends JApplet { @@ -284,7 +284,7 @@ public class ChordHelperApplet extends JApplet { */ public static class VersionInfo { public static final String NAME = "MIDI Chord Helper"; - public static final String VERSION = "Ver.20160504.2"; + public static final String VERSION = "Ver.20160505.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/"; diff --git a/src/camidion/chordhelper/mididevice/MidiCablePane.java b/src/camidion/chordhelper/mididevice/MidiCablePane.java index 283bcd3..a9e9a57 100644 --- a/src/camidion/chordhelper/mididevice/MidiCablePane.java +++ b/src/camidion/chordhelper/mididevice/MidiCablePane.java @@ -70,7 +70,8 @@ public class MidiCablePane extends JComponent { public void internalFrameClosing(InternalFrameEvent e) { JInternalFrame frame = e.getInternalFrame(); if( ! (frame instanceof MidiDeviceFrame) ) return; - MidiConnecterListModel devModel = ((MidiDeviceFrame)frame).listView.getModel(); + MidiDeviceFrame devFrame = (MidiDeviceFrame)frame; + MidiConnecterListModel devModel = devFrame.getMidiConnecterListView().getModel(); if( devModel.rxSupported() ) { colorMap.remove(devModel.getMidiDevice().getReceivers().get(0)); } @@ -118,7 +119,7 @@ public class MidiCablePane extends JComponent { for( JInternalFrame frame : frames ) { if( ! (frame instanceof MidiDeviceFrame) ) continue; MidiDeviceFrame txDeviceFrame = (MidiDeviceFrame)frame; - MidiConnecterListView txView = txDeviceFrame.listView; + MidiConnecterListView txView = txDeviceFrame.getMidiConnecterListView(); Transmitter draggingTx = txView.getDraggingTransmitter(); List txList = txView.getModel().getMidiDevice().getTransmitters(); for( Transmitter tx : txList ) { @@ -150,7 +151,8 @@ public class MidiCablePane extends JComponent { for( JInternalFrame anotherFrame : frames ) { if( ! (anotherFrame instanceof MidiDeviceFrame) ) continue; MidiDeviceFrame rxDeviceFrame = (MidiDeviceFrame)anotherFrame; - if( (rxRect = rxDeviceFrame.listView.getCellBounds(rx)) == null ) continue; + rxRect = rxDeviceFrame.getMidiConnecterListView().getCellBounds(rx); + if( rxRect == null ) continue; rxRect.translate( rxDeviceFrame.getRootPane().getX() + rxDeviceFrame.getContentPane().getX() + rxDeviceFrame.getX(), diff --git a/src/camidion/chordhelper/mididevice/MidiConnecterListModel.java b/src/camidion/chordhelper/mididevice/MidiConnecterListModel.java index 60b5472..9546bb7 100644 --- a/src/camidion/chordhelper/mididevice/MidiConnecterListModel.java +++ b/src/camidion/chordhelper/mididevice/MidiConnecterListModel.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Vector; import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiEvent; import javax.sound.midi.MidiUnavailableException; import javax.sound.midi.Receiver; import javax.sound.midi.Sequencer; @@ -45,16 +46,12 @@ public class MidiConnecterListModel extends AbstractListModel { * 対象MIDIデバイスを返します。 * @return 対象MIDIデバイス */ - public MidiDevice getMidiDevice() { - return device; - } + public MidiDevice getMidiDevice() { return device; } /** * 対象MIDIデバイスの名前を返します。 */ @Override - public String toString() { - return device.getDeviceInfo().toString(); - } + public String toString() { return device.getDeviceInfo().toString(); } @Override public AutoCloseable getElementAt(int index) { List rxList = device.getReceivers(); @@ -79,36 +76,33 @@ public class MidiConnecterListModel extends AbstractListModel { * @return 位置のインデックス(先頭が 0、見つからないとき -1) */ public int indexOf(AutoCloseable element) { + int index; List rxList = device.getReceivers(); - int index = rxList.indexOf(element); - if( index < 0 ) { - List txList = device.getTransmitters(); - if( (index = txList.indexOf(element)) >= 0 ) - index += rxList.size(); - } - return index; + if( (index = rxList.indexOf(element)) >= 0 ) return index; + List txList = device.getTransmitters(); + if( (index = txList.indexOf(element)) >= 0 ) return rxList.size() + index; + if( element.equals(newTransmitter) ) return rxList.size() + txList.size(); + return -1; } /** * このリストが {@link Transmitter} をサポートしているか調べます。 * @return {@link Transmitter} をサポートしていたら true */ - public boolean txSupported() { - return device.getMaxTransmitters() != 0; - } + public boolean txSupported() { return device.getMaxTransmitters() != 0; } /** * このリストが {@link Receiver} をサポートしているか調べます。 * @return {@link Receiver} をサポートしていたら true */ - public boolean rxSupported() { - return device.getMaxReceivers() != 0; - } + public boolean rxSupported() { return device.getMaxReceivers() != 0; } /** * このリストのMIDIデバイスの入出力タイプを返します。 - *

レシーバからMIDI信号を受けて外部へ出力できるデバイスの場合は MIDI_OUT、 - * 外部からMIDI信号を入力してトランスミッタからレシーバへ転送できるデバイスの場合は MIDI_IN、 - * 両方できるデバイスの場合は MIDI_IN_OUT を返します。 - *

* @return このリストのMIDIデバイスの入出力タイプ + *
    + *
  • MIDI_OUT: {@link Receiver}から受けた{@link MidiEvent}を音源や画面に出力するデバイス
  • + *
  • MIDI_IN: キーボードやシーケンサから入力した{@link MidiEvent}を{@link Transmitter}から{@link Receiver}へ転送するデバイス
  • + *
  • MIDI_IN_OUT: 上記両方の機能をサポートしたデバイス
  • + *
  • MIDI_NONE: 上記両方ともサポートしていないデバイス
  • + *
*/ public MidiDeviceInOutType getMidiDeviceInOutType() { if( rxSupported() ) { @@ -121,7 +115,7 @@ public class MidiConnecterListModel extends AbstractListModel { if( txSupported() ) return MidiDeviceInOutType.MIDI_IN; else - return null; + return MidiDeviceInOutType.MIDI_NONE; } } /** @@ -142,11 +136,10 @@ public class MidiConnecterListModel extends AbstractListModel { * @param anotherModel 接続先レシーバを持つリストモデル */ public void connectToReceiverOf(MidiConnecterListModel anotherModel) { - if( ! txSupported() || anotherModel == null || ! anotherModel.rxSupported() ) - return; + if( ! txSupported() || anotherModel == null || ! anotherModel.rxSupported() ) return; List rxList = anotherModel.device.getReceivers(); if( rxList.isEmpty() ) return; - getTransmitter().setReceiver(rxList.get(0)); + openTransmitter().setReceiver(rxList.get(0)); } /** * レシーバに未接続の最初のトランスミッタを返します。 @@ -154,7 +147,7 @@ public class MidiConnecterListModel extends AbstractListModel { * * @return 未接続のトランスミッタ */ - public Transmitter getTransmitter() { + public Transmitter openTransmitter() { if( ! txSupported() ) return null; List txList = device.getTransmitters(); for( Transmitter tx : txList ) if( tx.getReceiver() == null ) return tx; @@ -170,8 +163,7 @@ public class MidiConnecterListModel extends AbstractListModel { } /** * 指定のトランスミッタを閉じます。 - *

このリストモデルにないトランスミッタが指定された場合、無視されます。 - *

+ * このリストモデルにないトランスミッタが指定された場合、無視されます。 * @param txToClose 閉じたいトランスミッタ */ public void closeTransmitter(Transmitter txToClose) { @@ -189,10 +181,8 @@ public class MidiConnecterListModel extends AbstractListModel { } /** * 対象MIDIデバイスを閉じます。 - * - *

対象MIDIデバイスの Receiver を設定している - * {@link Transmitter} があればすべて閉じます。 - *

+ * 対象MIDIデバイスの{@link Receiver}を設定した他デバイスの{@link Transmitter}があれば、 + * それも閉じます。 */ public void closeDevice() { if( rxSupported() ) { @@ -241,11 +231,9 @@ public class MidiConnecterListModel extends AbstractListModel { if( m == this || ! m.txSupported() ) continue; for( int i=0; i { } // 元通りに接続し直す for( Receiver peerRx : peerRxList ) { - Transmitter tx = getTransmitter(); - if( tx == null ) continue; - tx.setReceiver(peerRx); + Transmitter tx = openTransmitter(); + if( tx != null ) tx.setReceiver(peerRx); } if( peerTxList != null ) { rx = device.getReceivers().get(0); diff --git a/src/camidion/chordhelper/mididevice/MidiConnecterListView.java b/src/camidion/chordhelper/mididevice/MidiConnecterListView.java index 7334183..5cf72fd 100644 --- a/src/camidion/chordhelper/mididevice/MidiConnecterListView.java +++ b/src/camidion/chordhelper/mididevice/MidiConnecterListView.java @@ -122,7 +122,7 @@ public class MidiConnecterListView extends JList { AutoCloseable transceiver = getModel().getElementAt(locationToIndex(dragStartPoint)); if( transceiver instanceof Transmitter ) { if( transceiver instanceof MidiConnecterListModel.NewTransmitter ) { - draggingObject.tx = getModel().getTransmitter(); + draggingObject.tx = getModel().openTransmitter(); } else { draggingObject.tx = (Transmitter)transceiver; diff --git a/src/camidion/chordhelper/mididevice/MidiDeviceFrame.java b/src/camidion/chordhelper/mididevice/MidiDeviceFrame.java index 765c861..6dd16f9 100644 --- a/src/camidion/chordhelper/mididevice/MidiDeviceFrame.java +++ b/src/camidion/chordhelper/mididevice/MidiDeviceFrame.java @@ -17,14 +17,21 @@ import javax.swing.event.InternalFrameEvent; * MIDIデバイスフレームビュー */ public class MidiDeviceFrame extends JInternalFrame { + + private MidiConnecterListView listView; /** - * デバイスの仮想MIDI端子リストビュー + * このデバイスフレームに貼り付けられた仮想MIDI端子リストビューを取得します。 + * @return 仮想MIDI端子リストビュー */ - MidiConnecterListView listView; + public MidiConnecterListView getMidiConnecterListView() { return listView; } + + private Timer timer; /** - * デバイスのタイムスタンプを更新するタイマー + * このデバイスフレームのタイムスタンプ表示更新用タイマーを取得します。 + * @return タイムスタンプ表示更新用タイマー */ - Timer timer; + public Timer getTimer() { return timer; } + /** * MIDIデバイスのモデルからフレームビューを構築します。 * @param model MIDIデバイスのTransmitter/Receiverリストモデル @@ -32,27 +39,17 @@ public class MidiDeviceFrame extends JInternalFrame { */ public MidiDeviceFrame(MidiConnecterListModel model, MidiCablePane cablePane) { super( null, true, true, false, false ); - // - // タイトルの設定 - String title = model.toString(); - if( model.txSupported() ) { - title = (model.rxSupported()?"[I/O] ":"[IN] ")+title; - } - else { - title = (model.rxSupported()?"[OUT] ":"[No I/O] ")+title; - } - setTitle(title); listView = new MidiConnecterListView(model, cablePane); + setTitle("[" + model.getMidiDeviceInOutType().getShortName() + "] " + model); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); - addInternalFrameListener( - new InternalFrameAdapter() { - public void internalFrameClosing(InternalFrameEvent e) { - MidiConnecterListModel m = listView.getModel(); - m.closeDevice(); - setVisible(m.getMidiDevice().isOpen()); - } + addInternalFrameListener(new InternalFrameAdapter() { + @Override + public void internalFrameClosing(InternalFrameEvent e) { + MidiConnecterListModel m = listView.getModel(); + m.closeDevice(); + setVisible(m.getMidiDevice().isOpen()); } - ); + }); setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); add(new JScrollPane(listView)); add(new JPanel() {{ @@ -65,12 +62,8 @@ public class MidiDeviceFrame extends JInternalFrame { long usec = dev.getMicrosecondPosition(); long sec = (usec == -1 ? -1 : usec/1000000); if( sec == this.sec ) return; - String text; - if( (this.sec = sec) == -1 ) - text = "No TimeStamp"; - else - text = String.format("TimeStamp: %02d:%02d", sec/60, sec%60); - setText(text); + this.sec = sec; + setText(sec == -1?"No TimeStamp":String.format("TimeStamp: %02d:%02d",sec/60,sec%60)); } }); }}); diff --git a/src/camidion/chordhelper/mididevice/MidiDeviceInOutType.java b/src/camidion/chordhelper/mididevice/MidiDeviceInOutType.java index a7b3fc1..50faa5c 100644 --- a/src/camidion/chordhelper/mididevice/MidiDeviceInOutType.java +++ b/src/camidion/chordhelper/mididevice/MidiDeviceInOutType.java @@ -4,14 +4,16 @@ package camidion.chordhelper.mididevice; * MIDIデバイス入出力タイプ */ public enum MidiDeviceInOutType { - MIDI_OUT("MIDI output devices (MIDI synthesizer etc.)"), - MIDI_IN("MIDI input devices (MIDI keyboard etc.)"), - MIDI_IN_OUT("MIDI input/output devices (MIDI sequencer etc.)"); + MIDI_NONE("No MIDI input/output supported", "No I/O"), + MIDI_OUT("MIDI output devices (MIDI synthesizer etc.)", "OUT"), + MIDI_IN("MIDI input devices (MIDI keyboard etc.)", "IN"), + MIDI_IN_OUT("MIDI input/output devices (MIDI sequencer etc.)", "I/O"); private String description; - private MidiDeviceInOutType(String description) { + private String shortName; + private MidiDeviceInOutType(String description, String shortName) { this.description = description; + this.shortName = shortName; } - public String getDescription() { - return description; - } -} \ No newline at end of file + public String getDescription() { return description; } + public String getShortName() { return shortName; } +} diff --git a/src/camidion/chordhelper/mididevice/MidiDeviceTreeModel.java b/src/camidion/chordhelper/mididevice/MidiDeviceTreeModel.java index dd0a846..46087da 100644 --- a/src/camidion/chordhelper/mididevice/MidiDeviceTreeModel.java +++ b/src/camidion/chordhelper/mididevice/MidiDeviceTreeModel.java @@ -20,15 +20,12 @@ public class MidiDeviceTreeModel implements TreeModel { public Object getRoot() { return "MIDI devices"; } @Override public Object getChild(Object parent, int index) { - if( parent == getRoot() ) { - return MidiDeviceInOutType.values()[index]; - } + if( parent == getRoot() ) return MidiDeviceInOutType.values()[index + 1]; if( parent instanceof MidiDeviceInOutType ) { MidiDeviceInOutType ioType = (MidiDeviceInOutType)parent; for( MidiConnecterListModel deviceModel : deviceModelList ) if( deviceModel.getMidiDeviceInOutType() == ioType ) { - if( index == 0 ) - return deviceModel; + if( index == 0 ) return deviceModel; index--; } } @@ -36,15 +33,12 @@ public class MidiDeviceTreeModel implements TreeModel { } @Override public int getChildCount(Object parent) { - if( parent == getRoot() ) { - return MidiDeviceInOutType.values().length; - } + if( parent == getRoot() ) return MidiDeviceInOutType.values().length - 1; int childCount = 0; if( parent instanceof MidiDeviceInOutType ) { MidiDeviceInOutType ioType = (MidiDeviceInOutType)parent; for( MidiConnecterListModel deviceModel : deviceModelList ) - if( deviceModel.getMidiDeviceInOutType() == ioType ) - childCount++; + if( deviceModel.getMidiDeviceInOutType() == ioType ) childCount++; } return childCount; } @@ -53,7 +47,7 @@ public class MidiDeviceTreeModel implements TreeModel { if( parent == getRoot() ) { if( child instanceof MidiDeviceInOutType ) { MidiDeviceInOutType ioType = (MidiDeviceInOutType)child; - return ioType.ordinal(); + return ioType.ordinal() - 1; } } if( parent instanceof MidiDeviceInOutType ) { @@ -61,8 +55,7 @@ public class MidiDeviceTreeModel implements TreeModel { int index = 0; for( MidiConnecterListModel deviceModel : deviceModelList ) { if( deviceModel.getMidiDeviceInOutType() == ioType ) { - if( deviceModel == child ) - return index; + if( deviceModel == child ) return index; index++; } } @@ -70,9 +63,7 @@ public class MidiDeviceTreeModel implements TreeModel { return -1; } @Override - public boolean isLeaf(Object node) { - return node instanceof MidiConnecterListModel; - } + public boolean isLeaf(Object node) { return node instanceof MidiConnecterListModel; } @Override public void valueForPathChanged(TreePath path, Object newValue) {} // diff --git a/src/camidion/chordhelper/mididevice/MidiDeviceTreeView.java b/src/camidion/chordhelper/mididevice/MidiDeviceTreeView.java index d1e547e..8ab0aa6 100644 --- a/src/camidion/chordhelper/mididevice/MidiDeviceTreeView.java +++ b/src/camidion/chordhelper/mididevice/MidiDeviceTreeView.java @@ -67,8 +67,7 @@ public class MidiDeviceTreeView extends JTree if(leaf) { setIcon(MidiConnecterListView.MIDI_CONNECTER_ICON); setDisabledIcon(MidiConnecterListView.MIDI_CONNECTER_ICON); - MidiConnecterListModel listModel = (MidiConnecterListModel)value; - setEnabled( ! listModel.getMidiDevice().isOpen() ); + setEnabled( ! ((MidiConnecterListModel)value).getMidiDevice().isOpen() ); } return this; } diff --git a/src/camidion/chordhelper/mididevice/MidiOpenedDevicesView.java b/src/camidion/chordhelper/mididevice/MidiOpenedDevicesView.java index fe0218c..323792f 100644 --- a/src/camidion/chordhelper/mididevice/MidiOpenedDevicesView.java +++ b/src/camidion/chordhelper/mididevice/MidiOpenedDevicesView.java @@ -1,6 +1,5 @@ package camidion.chordhelper.mididevice; -import java.awt.Point; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetAdapter; @@ -20,7 +19,9 @@ import javax.swing.Timer; * 開いている MIDI デバイスを置くためのデスクトップビュー */ public class MidiOpenedDevicesView extends JDesktopPane { + private MidiCablePane cablePane = new MidiCablePane(this); + private DropTargetAdapter dropTargetListener = new DropTargetAdapter() { @Override public void dragEnter(DropTargetDragEvent dtde) { @@ -32,59 +33,60 @@ public class MidiOpenedDevicesView extends JDesktopPane { public void drop(DropTargetDropEvent dtde) { dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); try { - int action = dtde.getDropAction() ; - if( (action & DnDConstants.ACTION_COPY_OR_MOVE) != 0 ) { - Object data = dtde.getTransferable().getTransferData(MidiDeviceTreeView.TREE_MODEL_FLAVOR); - if( data instanceof MidiConnecterListModel ) { - MidiConnecterListModel deviceModel = (MidiConnecterListModel)data; - try { - deviceModel.openDevice(); - } catch( MidiUnavailableException e ) { - // - // デバイスを開くのに失敗した場合 - // - // 例えば、「Microsort MIDI マッパー」と - // 「Microsoft GS Wavetable SW Synth」を - // 同時に開こうとするとここに来る。 - // - String title = "Cannot open MIDI device"; - String message = "MIDIデバイス "+deviceModel+" はすでに使用中です。\n" - +"他のデバイスが連動して開いていないか確認してください。\n\n" - + e.getMessage(); - dtde.dropComplete(false); - JOptionPane.showMessageDialog(null, message, title, JOptionPane.ERROR_MESSAGE); - return; - } - if( ! deviceModel.getMidiDevice().isOpen() ) { - // 例外が出なかったにも関わらずデバイスが開かれていない場合 - String title = "Cannot open MIDI device"; - String message = "MIDIデバイス "+deviceModel+" はすでに使用中です。\n" - +"他のデバイスが連動して開いていないか確認してください。"; - dtde.dropComplete(false); - JOptionPane.showMessageDialog(null, message, title, JOptionPane.ERROR_MESSAGE); - return; - } - dtde.dropComplete(true); - // - // デバイスが正常に開かれたことを確認できたら - // ドロップした場所へフレームを配置して可視化する。 - // - MidiDeviceFrame deviceFrame = getMidiDeviceFrameOf(deviceModel); - if( deviceFrame == null ) return; - Point loc = dtde.getLocation(); - loc.translate( -deviceFrame.getWidth()/2, 0 ); - deviceFrame.setLocation(loc); - deviceFrame.setVisible(true); - return; - } + int maskedBits = dtde.getDropAction() & DnDConstants.ACTION_COPY_OR_MOVE; + if( maskedBits == 0 ) { + dtde.dropComplete(false); + return; + } + Object data = dtde.getTransferable().getTransferData(MidiDeviceTreeView.TREE_MODEL_FLAVOR); + if( ! (data instanceof MidiConnecterListModel) ) { + dtde.dropComplete(false); + return; + } + MidiConnecterListModel deviceModel = (MidiConnecterListModel)data; + try { + deviceModel.openDevice(); + } catch( MidiUnavailableException e ) { + // + // デバイスを開くのに失敗した場合 + // + // 例えば、「Microsort MIDI マッパー」と + // 「Microsoft GS Wavetable SW Synth」を + // 同時に開こうとするとここに来る。 + // + String title = "Cannot open MIDI device"; + String message = "MIDIデバイス "+deviceModel+" はすでに使用中です。\n" + +"他のデバイスが連動して開いていないか確認してください。\n\n" + + e.getMessage(); + dtde.dropComplete(false); + JOptionPane.showMessageDialog(null, message, title, JOptionPane.ERROR_MESSAGE); + return; + } + if( ! deviceModel.getMidiDevice().isOpen() ) { + // 例外が出なかったにも関わらずデバイスが開かれていない場合 + String title = "Cannot open MIDI device"; + String message = "MIDIデバイス "+deviceModel+" はすでに使用中です。\n" + +"他のデバイスが連動して開いていないか確認してください。"; + dtde.dropComplete(false); + JOptionPane.showMessageDialog(null, message, title, JOptionPane.ERROR_MESSAGE); + return; } + dtde.dropComplete(true); + // + // デバイスが正常に開かれたことを確認できたら + // ドロップした場所へフレームを配置して可視化する。 + // + MidiDeviceFrame deviceFrame = getMidiDeviceFrameOf(deviceModel); + deviceFrame.setLocation(dtde.getLocation()); + deviceFrame.setVisible(true); } catch (Exception ex) { ex.printStackTrace(); + dtde.dropComplete(false); } - dtde.dropComplete(false); } }; + public MidiOpenedDevicesView(MidiDeviceTreeView deviceTree) { add(cablePane, JLayeredPane.PALETTE_LAYER); int openedFrameIndex = 0; @@ -92,16 +94,16 @@ public class MidiOpenedDevicesView extends JDesktopPane { for( MidiConnecterListModel deviceModel : treeModel.deviceModelList ) { deviceModel.addListDataListener(cablePane.midiConnecterListDataListener); MidiDeviceFrame frame = new MidiDeviceFrame(deviceModel, cablePane) {{ + setSize(250, 100); addInternalFrameListener(cablePane.midiDeviceFrameListener); addComponentListener(cablePane.midiDeviceFrameComponentListener); }}; frame.addInternalFrameListener(deviceTree.midiDeviceFrameListener); add(frame); - if( deviceModel.getMidiDevice().isOpen() ) { - frame.setBounds( 10+(openedFrameIndex%2)*260, 10+openedFrameIndex*55, 250, 100 ); - frame.setVisible(true); - openedFrameIndex++; - } + if( ! deviceModel.getMidiDevice().isOpen() ) continue; + frame.setLocation( 10+(openedFrameIndex%2)*260, 10+openedFrameIndex*55 ); + frame.setVisible(true); + openedFrameIndex++; } addComponentListener(new ComponentAdapter() { @Override @@ -109,6 +111,7 @@ public class MidiOpenedDevicesView extends JDesktopPane { }); new DropTarget( this, DnDConstants.ACTION_COPY_OR_MOVE, dropTargetListener, true ); } + /** * 指定されたMIDIデバイスモデルに対するMIDIデバイスフレームを返します。 * @@ -120,10 +123,13 @@ public class MidiOpenedDevicesView extends JDesktopPane { for( JInternalFrame frame : frames ) { if( ! (frame instanceof MidiDeviceFrame) ) continue; MidiDeviceFrame deviceFrame = (MidiDeviceFrame)frame; - if( deviceModel.equals(deviceFrame.listView.getModel()) ) return deviceFrame; + if( deviceModel.equals(deviceFrame.getMidiConnecterListView().getModel()) ) { + return deviceFrame; + } } return null; } + private boolean isTimerStarted; /** * タイムスタンプを更新するタイマーを開始または停止します。 @@ -135,7 +141,7 @@ public class MidiOpenedDevicesView extends JDesktopPane { JInternalFrame[] frames = getAllFramesInLayer(JLayeredPane.DEFAULT_LAYER); for( JInternalFrame frame : frames ) { if( ! (frame instanceof MidiDeviceFrame) ) continue; - Timer timer = ((MidiDeviceFrame)frame).timer; + Timer timer = ((MidiDeviceFrame)frame).getTimer(); if( toStart ) timer.start(); else timer.stop(); } } -- 2.11.0