package gsingh.learnkirtan.ui;
import static gsingh.learnkirtan.Constants.BLACK_KEY_WIDTH;
import static gsingh.learnkirtan.Constants.MAX_KEYS;
import static gsingh.learnkirtan.Constants.WHITE_KEY_WIDTH;
import gsingh.learnkirtan.keys.BlackKey;
import gsingh.learnkirtan.keys.Key;
import gsingh.learnkirtan.keys.KeyMapper;
import gsingh.learnkirtan.keys.LabelManager;
import gsingh.learnkirtan.keys.WhiteKey;
import gsingh.learnkirtan.listener.SettingsChangedListener;
import gsingh.learnkirtan.settings.SettingsManager;
import javax.swing.JLayeredPane;
@SuppressWarnings("serial")
public class PianoPanel extends JLayeredPane implements SettingsChangedListener {
private Key keys[] = new Key[MAX_KEYS];
private int index;
private LabelManager labelManager;
private SettingsManager settingsManager = SettingsManager.getInstance();
public PianoPanel(LabelManager labelManager) {
this.labelManager = labelManager;
int i = 0;
int j = 0;
for (int k = 0; k < 3; k++) {
addWhiteKey(i++);
addBlackKey(j++);
addWhiteKey(i++);
addBlackKey(j++);
addWhiteKey(i++);
addWhiteKey(i++);
j++;
addBlackKey(j++);
addWhiteKey(i++);
addBlackKey(j++);
addWhiteKey(i++);
addBlackKey(j++);
j++;
addWhiteKey(i++);
}
KeyMapper.getInstance().setKeys(keys);
if (settingsManager.getShowSargamLabels())
labelManager.labelSargamNotes();
if (settingsManager.getShowKeyboardLabels())
labelManager.labelKeyboardNotes();
}
/**
* Adds a white key to the piano panel
*
* @param panel
* - the panel to which to add the key
* @param i
* - a number which is used to calculate the position of the key
*/
private void addWhiteKey(int i) {
if (index < MAX_KEYS) {
WhiteKey b = new WhiteKey(labelManager);
b.setLocation(i++ * WHITE_KEY_WIDTH, 0);
add(b, 0, -1);
keys[index++] = b;
}
}
/**
* Adds a black key to the piano panel
*
* @param panel
* - the panel to which to add the key
* @param factor
* - a number which is used to calculate the position of the key
*/
private void addBlackKey(int factor) {
if (index < MAX_KEYS) {
BlackKey b = new BlackKey(labelManager);
b.setLocation(WHITE_KEY_WIDTH - BLACK_KEY_WIDTH / 2 + factor
* WHITE_KEY_WIDTH, 0);
add(b, 1, -1);
keys[index++] = b;
}
}
@Override
public void onSettingsChanged(String settingsPath, String oldValue,
String newValue) {
if (settingsPath.equals(SettingsManager.SA_KEY_XPATH)) {
if (settingsManager.getShowSargamLabels())
labelManager.labelSargamNotes();
if (settingsManager.getShowKeyboardLabels())
labelManager.labelKeyboardNotes();
} else if (settingsPath
.equals(SettingsManager.SHOW_KEYBOARD_LABELS_XPATH)) {
if (newValue.equals("true"))
labelManager.labelKeyboardNotes();
else if (newValue.equals("false"))
labelManager.clearKeyboardNotes();
else
assert false; // TODO Write proper abort code
} else if (settingsPath
.equals(SettingsManager.SHOW_SARGAM_LABELS_XPATH)) {
if (newValue.equals("true"))
labelManager.labelSargamNotes();
else if (newValue.equals("false"))
labelManager.clearSargamNotes();
else
assert false;
}
}
}