package org.herac.tuxguitar.gui.tools.scale;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.herac.tuxguitar.gui.editors.chord.ChordSelector;
import org.herac.tuxguitar.gui.tools.scale.xml.ScaleReader;
import org.herac.tuxguitar.gui.util.TGFileUtils;
import org.herac.tuxguitar.gui.util.TGMusicKeyUtils;
import org.herac.tuxguitar.song.models.TGScale;
public class ScaleManager {
private static final String[] KEY_NAMES = TGMusicKeyUtils
.getSharpKeyNames(TGMusicKeyUtils.PREFIX_SCALE);
private static final String KEY_SEPARATOR = ",";
public static final int NONE_SELECTION = -1;
private TGScale scale;
private List<ScaleListener> scaleListeners;
private List<ScaleInfo> scales;
private int selectionIndex;
private int selectionKey;
public ScaleManager() {
this.scales = new ArrayList<ScaleInfo>();
this.scaleListeners = new ArrayList<ScaleListener>();
this.scale = new TGScale();
this.selectionKey = 0;
this.selectionIndex = NONE_SELECTION;
this.loadScales();
}
public void addListener(ScaleListener listener) {
if (!this.scaleListeners.contains(listener)) {
this.scaleListeners.add(listener);
}
}
public int countScales() {
return this.scales.size();
}
public void fireListeners() {
for (int i = 0; i < this.scaleListeners.size(); i++) {
ScaleListener listener = (ScaleListener) this.scaleListeners.get(i);
listener.loadScale();
}
}
public String getKeyName(int index) {
if (index >= 0 && index < KEY_NAMES.length) {
return KEY_NAMES[index];
}
return null;
}
public String[] getKeyNames() {
return KEY_NAMES;
}
public TGScale getScale() {
return this.scale;
}
public String getScaleKeys(int index) {
if (index >= 0 && index < this.scales.size()) {
return (((ScaleInfo) this.scales.get(index)).getKeys());
}
return null;
}
public String getScaleName(int index) {
if (index >= 0 && index < this.scales.size()) {
return (((ScaleInfo) this.scales.get(index)).getName());
}
return null;
}
public String[] getScaleNames() {
String[] names = new String[this.scales.size()];
for (int i = 0; i < this.scales.size(); i++) {
ScaleInfo info = (ScaleInfo) this.scales.get(i);
names[i] = info.getName();
}
return names;
}
public int getSelectionIndex() {
return this.selectionIndex;
}
public int getSelectionKey() {
return this.selectionKey;
}
private void loadScales() {
try {
new ScaleReader().loadScales(this.scales, TGFileUtils
.getResourceAsStream("scales/scales.xml"));
} catch (Throwable e) {
LOG.error(e);
}
}
/** The Logger for this class. */
public static final transient Logger LOG = Logger
.getLogger(ScaleManager.class);
public void removeListener(ScaleListener listener) {
if (this.scaleListeners.contains(listener)) {
this.scaleListeners.remove(listener);
}
}
public void selectScale(int index, int key) {
if (index == NONE_SELECTION) {
getScale().clear();
} else if (index >= 0 && index < this.scales.size()) {
getScale().clear();
ScaleInfo info = (ScaleInfo) this.scales.get(index);
String[] keys = info.getKeys().split(KEY_SEPARATOR);
for (int i = 0; i < keys.length; i++) {
int note = (Integer.parseInt(keys[i]) - 1);
if (note >= 0 && note < 12) {
getScale().setNote(note, true);
}
}
getScale().setKey(key);
}
this.selectionIndex = index;
this.selectionKey = key;
this.fireListeners();
}
}