OSDN Git Service

リファクタリング
[midichordhelper/MIDIChordHelper.git] / src / camidion / chordhelper / midieditor / TimeSignatureSelecter.java
1 package camidion.chordhelper.midieditor;
2
3 import javax.sound.midi.MetaMessage;
4 import javax.swing.JComboBox;
5 import javax.swing.JLabel;
6 import javax.swing.JPanel;
7 import javax.swing.JSpinner;
8 import javax.swing.SpinnerNumberModel;
9
10 /**
11  * 拍子選択ビュー
12  */
13 public class TimeSignatureSelecter extends JPanel {
14         protected SpinnerNumberModel upperTimesigModel = new SpinnerNumberModel(4, 1, 32, 1);
15         private JSpinner upperTimesigView = new JSpinner(upperTimesigModel) {
16                 { setToolTipText("Time signature (upper digit) - 拍子の分子"); }
17         };
18         protected JComboBox<String> lowerTimesigView = new JComboBox<String>() {
19                 {
20                         setToolTipText("Time signature (lower digit) - 拍子の分母");
21                         for(int i=0; i<6; i++) addItem("/"+(1<<i)); setSelectedIndex(2);
22                 }
23         };
24         private static class TimeSignatureLabel extends JLabel {
25                 { setToolTipText("Time signature - 拍子"); }
26                 private byte upper = -1;
27                 private byte lowerIndex = -1;
28                 public void setTimeSignature(byte upper, byte lowerIndex) {
29                         if( this.upper == upper && this.lowerIndex == lowerIndex ) return;
30                         setText("<html><font size=\"+1\">"+upper+"/"+(1<<lowerIndex)+"</font></html>");
31                         this.upper = upper;
32                         this.lowerIndex = lowerIndex;
33                 }
34         }
35         private TimeSignatureLabel timesigValueLabel = new TimeSignatureLabel();
36         public TimeSignatureSelecter() {
37                 add(upperTimesigView);
38                 add(lowerTimesigView);
39                 add(timesigValueLabel);
40                 setEditable(true);
41         }
42         public byte[] getByteArray() {
43                 byte upper = upperTimesigModel.getNumber().byteValue();
44                 byte lowerIndex = (byte)lowerTimesigView.getSelectedIndex();
45                 return new byte[] { upper, lowerIndex, (byte)(96 >> lowerIndex), 8 };
46         }
47         protected void updateTimesigValueLabel() {
48                 timesigValueLabel.setTimeSignature(
49                         upperTimesigModel.getNumber().byteValue(),
50                         (byte)lowerTimesigView.getSelectedIndex()
51                 );
52         }
53         public void setValue(byte upper, byte lowerIndex) {
54                 upperTimesigModel.setValue(upper);
55                 lowerTimesigView.setSelectedIndex(lowerIndex);
56                 timesigValueLabel.setTimeSignature(upper, lowerIndex);
57         }
58         public void setValue(byte[] data) {
59                 if(data == null) clear(); else setValue(data[0], data[1]);
60         }
61         public void setValueAt(SequenceTickIndex tickIndex, long tickPosition) {
62                 MetaMessage msg = tickIndex.lastMetaMessageAt(
63                         SequenceTickIndex.MetaMessageType.TIME_SIGNATURE,
64                         tickPosition
65                 );
66                 setValue(msg==null ? null : msg.getData());
67         }
68         private boolean editable;
69         public boolean isEditable() { return editable; }
70         public void setEditable(boolean editable) {
71                 this.editable = editable;
72                 upperTimesigView.setVisible(editable);
73                 lowerTimesigView.setVisible(editable);
74                 timesigValueLabel.setVisible(!editable);
75                 if(!editable) updateTimesigValueLabel();
76         }
77         public void clear() {
78                 upperTimesigModel.setValue(4);
79                 lowerTimesigView.setSelectedIndex(2);
80                 updateTimesigValueLabel();
81         }
82 }