OSDN Git Service

リファクタリング
[midichordhelper/MIDIChordHelper.git] / src / camidion / chordhelper / mididevice / SequencerMeasureView.java
1 package camidion.chordhelper.mididevice;
2
3 import java.awt.Color;
4
5 import javax.sound.midi.Sequencer;
6 import javax.swing.BoxLayout;
7 import javax.swing.JLabel;
8 import javax.swing.JPanel;
9 import javax.swing.event.ChangeEvent;
10 import javax.swing.event.ChangeListener;
11
12 import camidion.chordhelper.midieditor.SequenceTickIndex;
13 import camidion.chordhelper.midieditor.SequenceTrackListTableModel;
14
15 /**
16  * 小節表示ビュー
17  */
18 public class SequencerMeasureView extends JPanel {
19         private MeasurePositionLabel measurePositionLabel;
20         private MeasureLengthLabel measureLengthLabel;
21         /**
22          * シーケンサの現在の小節位置を表示するビューを構築します。
23          * @param model スライダー用の時間範囲データモデル
24          */
25         public SequencerMeasureView(MidiSequencerModel model) {
26                 setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
27                 add(measurePositionLabel = new MeasurePositionLabel());
28                 add(measureLengthLabel = new MeasureLengthLabel());
29                 model.addChangeListener(new ChangeListener() {
30                         @Override
31                         public void stateChanged(ChangeEvent e) {
32                                 Object source = e.getSource();
33                                 if( ! (source instanceof MidiSequencerModel) ) return;
34                                 MidiSequencerModel model = (MidiSequencerModel)source;
35                                 Sequencer sequencer = model.getSequencer();
36                                 SequenceTrackListTableModel sequenceTableModel = model.getSequenceTrackListTableModel();
37                                 SequenceTickIndex tickIndex = (
38                                         sequenceTableModel == null ? null : sequenceTableModel.getSequenceTickIndex()
39                                 );
40                                 if( ! sequencer.isRunning() || sequencer.isRecording() ) {
41                                         // 停止中または録音中の場合、長さが変わることがあるので表示を更新
42                                         if( tickIndex == null ) {
43                                                 measureLengthLabel.setMeasure(0);
44                                         }
45                                         else {
46                                                 long tickLength = sequencer.getTickLength();
47                                                 int measureLength = tickIndex.tickToMeasure(tickLength);
48                                                 measureLengthLabel.setMeasure(measureLength);
49                                         }
50                                 }
51                                 // 小節位置の表示を更新
52                                 if( tickIndex == null ) {
53                                         measurePositionLabel.setMeasure(0, 0);
54                                 }
55                                 else {
56                                         long tickPosition = sequencer.getTickPosition();
57                                         int measurePosition = tickIndex.tickToMeasure(tickPosition);
58                                         measurePositionLabel.setMeasure(measurePosition, tickIndex.lastBeat);
59                                 }
60                         }
61                 });
62         }
63         private static abstract class MeasureLabel extends JLabel {
64                 protected int measure = -1;
65                 public boolean setMeasure(int measure) {
66                         if( this.measure == measure ) return false;
67                         this.measure = measure;
68                         return true;
69                 }
70         }
71         private static class MeasurePositionLabel extends MeasureLabel {
72                 protected int beat = 0;
73                 public MeasurePositionLabel() {
74                         setFont( getFont().deriveFont(getFont().getSize2D() + 4) );
75                         setForeground( new Color(0x80,0x00,0x00) );
76                         setText("0001:01");
77                         setToolTipText("Measure:beat position - 何小節目:何拍目");
78                 }
79                 public boolean setMeasure(int measure, int beat) {
80                         if( ! super.setMeasure(measure) && this.beat == beat )
81                                 return false;
82                         setText(String.format("%04d:%02d", measure+1, beat+1));
83                         return true;
84                 }
85         }
86         private static class MeasureLengthLabel extends MeasureLabel {
87                 public MeasureLengthLabel() {
88                         setText("/0000");
89                         setToolTipText("Measure length - 小節の数");
90                 }
91                 public boolean setMeasure(int measure) {
92                         if( ! super.setMeasure(measure) )
93                                 return false;
94                         setText(String.format("/%04d", measure));
95                         return true;
96                 }
97         }
98 }