OSDN Git Service

MIDIデバイス周りのバグ修正など
[midichordhelper/MIDIChordHelper.git] / src / camidion / chordhelper / mididevice / MidiDeviceFrame.java
1 package camidion.chordhelper.mididevice;
2
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5
6 import javax.sound.midi.MidiDevice;
7 import javax.swing.BoxLayout;
8 import javax.swing.JInternalFrame;
9 import javax.swing.JLabel;
10 import javax.swing.JPanel;
11 import javax.swing.JScrollPane;
12 import javax.swing.Timer;
13 import javax.swing.event.InternalFrameAdapter;
14 import javax.swing.event.InternalFrameEvent;
15
16 /**
17  * MIDIデバイスフレームビュー
18  */
19 public class MidiDeviceFrame extends JInternalFrame {
20
21         private MidiConnecterListView listView;
22         /**
23          * このデバイスフレームに貼り付けられた仮想MIDI端子リストビューを取得します。
24          * @return 仮想MIDI端子リストビュー
25          */
26         public MidiConnecterListView getMidiConnecterListView() { return listView; }
27
28         private Timer timer;
29         /**
30          * このデバイスフレームのタイムスタンプ表示更新用タイマーを取得します。
31          * @return タイムスタンプ表示更新用タイマー
32          */
33         public Timer getTimer() { return timer; }
34
35         /**
36          * MIDIデバイスのモデルからフレームビューを構築します。
37          * @param model MIDIデバイスのTransmitter/Receiverリストモデル
38          * @param cablePane MIDIケーブル描画面
39          */
40         public MidiDeviceFrame(MidiConnecterListModel model, MidiCablePane cablePane) {
41                 super( null, true, true, false, false );
42                 listView = new MidiConnecterListView(model, cablePane);
43                 setTitle("[" + model.getMidiDeviceInOutType().getShortName() + "] " + model);
44                 setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
45                 addInternalFrameListener(new InternalFrameAdapter() {
46                         @Override
47                         public void internalFrameClosing(InternalFrameEvent e) {
48                                 MidiConnecterListModel m = listView.getModel();
49                                 m.closeDevice();
50                                 setVisible(m.getMidiDevice().isOpen());
51                         }
52                 });
53                 setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
54                 add(new JScrollPane(listView));
55                 add(new JPanel() {{
56                         add(new JLabel() {{
57                                 timer = new Timer(50, new ActionListener() {
58                                         private long sec = -2;
59                                         private MidiDevice dev = listView.getModel().getMidiDevice();
60                                         @Override
61                                         public void actionPerformed(ActionEvent e) {
62                                                 long usec = dev.getMicrosecondPosition();
63                                                 long sec = (usec == -1 ? -1 : usec/1000000);
64                                                 if( sec == this.sec ) return;
65                                                 this.sec = sec;
66                                                 setText(sec == -1?"No TimeStamp":String.format("TimeStamp: %02d:%02d",sec/60,sec%60));
67                                         }
68                                 });
69                         }});
70                 }});
71         }
72 }