OSDN Git Service

リファクタリング(クラスの整理)
[midichordhelper/MIDIChordHelper.git] / src / camidion / chordhelper / midieditor / KeySignatureSelecter.java
1 package camidion.chordhelper.midieditor;
2
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5
6 import javax.swing.JCheckBox;
7 import javax.swing.JComboBox;
8 import javax.swing.JLabel;
9 import javax.swing.JPanel;
10
11 import camidion.chordhelper.music.Key;
12 import camidion.chordhelper.music.Note;
13
14 /**
15  * 調性選択フォーム
16  */
17 public class KeySignatureSelecter extends JPanel implements ActionListener {
18         public JComboBox<Key> keysigCombobox = new JComboBox<Key>() {
19                 {
20                         for(int co5 = -Key.MAX_SHARPS_OR_FLATS ; co5 <= Key.MAX_SHARPS_OR_FLATS ; co5++)
21                                 addItem(new Key(co5));
22                         setMaximumRowCount(getItemCount());
23                 }
24         };
25         JCheckBox minorCheckbox = null;
26
27         /**
28          * 調性選択フォームを構築します。
29          * 初期値としてメジャー・マイナーの区別がある調を指定した場合、
30          * メジャー・マイナーを選択できるminorチェックボックス付きで構築されます。
31          * @param key 調の初期値
32          */
33         public KeySignatureSelecter(Key key) {
34                 add(new JLabel("Key:"));
35                 add(keysigCombobox);
36                 if(key.majorMinor() != Key.MajorMinor.MAJOR_OR_MINOR) {
37                         add(minorCheckbox = new JCheckBox("minor"));
38                         minorCheckbox.addActionListener(this);
39                 }
40                 keysigCombobox.addActionListener(this);
41                 setSelectedKey(key);
42         }
43
44         @Override
45         public void actionPerformed(ActionEvent e) {
46                 Key key = (Key)keysigCombobox.getSelectedItem();
47                 keysigCombobox.setToolTipText(
48                         "Key: " + key.toStringIn( Note.Language.NAME )
49                         + " "  + key.toStringIn( Note.Language.IN_JAPANESE )
50                         + " (" + key.signatureDescription() + ")"
51                 );
52         }
53
54         /**
55          * 調の選択を、引数で指定された通りに変更します。
56          * メジャー・マイナーの区別のない調が指定された場合、
57          * minorチェックボックスは変更されず、プルダウン選択のみが変更されます。
58          *
59          * @param key 選択する調
60          */
61         public void setSelectedKey(Key key) {
62                 setMajorMinor(key.majorMinor());
63                 if( key.majorMinor() != Key.MajorMinor.MAJOR_OR_MINOR ) key = new Key(key.toCo5());
64                 keysigCombobox.setSelectedItem(key);
65         }
66         /**
67          * 選択されている調を返します。minorチェックボックスがある場合はメジャー・マイナーの区別つき、
68          * そうでない場合は区別なしの調を返します。
69          *
70          * @return 選択されている調
71          */
72         public Key getSelectedKey() {
73                 Key key = (Key)keysigCombobox.getSelectedItem();
74                 return minorCheckbox == null ? key : new Key(key.toCo5(), getMajorMinor());
75         }
76
77         private void setMajorMinor(Key.MajorMinor majorMinor) {
78                 if( minorCheckbox == null || majorMinor == Key.MajorMinor.MAJOR_OR_MINOR ) return;
79                 minorCheckbox.setSelected(majorMinor == Key.MajorMinor.MINOR);
80         }
81         private Key.MajorMinor getMajorMinor() {
82                 return minorCheckbox == null ? Key.MajorMinor.MAJOR_OR_MINOR :
83                         minorCheckbox.isSelected() ? Key.MajorMinor.MINOR : Key.MajorMinor.MAJOR;
84         }
85 }