package org.herac.tuxguitar.gui.system.keybindings;
import java.util.StringTokenizer;
public class KeyBinding {
public static final String MASK_SEPARATOR = "+";
private int mask;
private int key;
public KeyBinding(int key,int mask){
this.key = key;
this.mask = mask;
}
public KeyBinding(){
this(0,0);
}
public int getKey() {
return this.key;
}
public void setKey(int key) {
this.key = key;
}
public int getMask() {
return this.mask;
}
public void setMask(int mask) {
this.mask = mask;
}
private String getSpecialKey(){
for(int i = 0; i < KeyConversion.relations.length; i++){
if (this.key == KeyConversion.relations[i].getCode()){
return KeyConversion.relations[i].getKey();
}
}
return null;
}
private String getSpecialMask(){
String mask = new String();
for(int i = 0; i < KeyConversion.relations.length; i++){
if ( (this.mask & KeyConversion.relations[i].getCode()) == KeyConversion.relations[i].getCode()){
mask += KeyConversion.relations[i].getKey() + MASK_SEPARATOR;
}
}
return mask;
}
public boolean isSameAs(KeyBinding kb){
if( kb != null ){
return (this.key == kb.key && this.mask == kb.mask);
}
return false;
}
public String toString(){
String mask = getSpecialMask();
String key = getSpecialKey();
return (key != null ? (mask + key) : (mask + (char)this.key) );
}
public Object clone(){
return new KeyBinding(getKey(),getMask());
}
public static KeyBinding parse(String keyString){
KeyBinding keybinding = new KeyBinding();
// process mask
int maskCode=0;
String key = keyString;
if (keyString.indexOf(MASK_SEPARATOR)!= -1){
StringTokenizer st = new StringTokenizer(keyString,MASK_SEPARATOR);
while(st.hasMoreTokens()){
String token = st.nextToken();
// only process if this is not the last token
if (st.hasMoreTokens()){
// add the mask
maskCode |= getSpecialCode(token);
}
else {
key = token;
}
}
}
keybinding.setMask(maskCode);
// process key
int keycode = getSpecialCode(key);
if (keycode == 0)
keycode = getKeyCode(key);
keybinding.setKey(keycode);
return keybinding;
}
private static int getKeyCode(String key){
return key.charAt(0);
}
private static int getSpecialCode(String key){
for(int i = 0; i < KeyConversion.relations.length; i++){
if (KeyConversion.relations[i].getKey().equals(key)){
return KeyConversion.relations[i].getCode();
}
}
return 0;
}
}
class KeyConversion {
protected static final KeyConversion[] relations = new KeyConversion[]{
new KeyConversion("F1",KeyBindingConstants.F1),
new KeyConversion("F2",KeyBindingConstants.F2),
new KeyConversion("F3",KeyBindingConstants.F3),
new KeyConversion("F4",KeyBindingConstants.F4),
new KeyConversion("F5",KeyBindingConstants.F5),
new KeyConversion("F6",KeyBindingConstants.F6),
new KeyConversion("F7",KeyBindingConstants.F7),
new KeyConversion("F8",KeyBindingConstants.F8),
new KeyConversion("F9",KeyBindingConstants.F9),
new KeyConversion("F10",KeyBindingConstants.F10),
new KeyConversion("F11",KeyBindingConstants.F11),
new KeyConversion("F12",KeyBindingConstants.F12),
new KeyConversion("Esc",KeyBindingConstants.ESC),
new KeyConversion("Pause",KeyBindingConstants.PAUSE),
new KeyConversion("Print",KeyBindingConstants.PRINT_SCREEN),
new KeyConversion("Ins",KeyBindingConstants.INSERT),
new KeyConversion("Del",KeyBindingConstants.DELETE),
new KeyConversion("Home",KeyBindingConstants.HOME),
new KeyConversion("PgUp",KeyBindingConstants.PAGE_UP),
new KeyConversion("PgDn",KeyBindingConstants.PAGE_DOWN),
new KeyConversion("End",KeyBindingConstants.END),
new KeyConversion("Up",KeyBindingConstants.UP),
new KeyConversion("Down",KeyBindingConstants.DOWN),
new KeyConversion("Left",KeyBindingConstants.LEFT),
new KeyConversion("Right",KeyBindingConstants.RIGHT),
new KeyConversion("Control",KeyBindingConstants.CONTROL),
new KeyConversion("Shift",KeyBindingConstants.SHIFT),
new KeyConversion("Alt",KeyBindingConstants.ALT),
new KeyConversion("Tab",KeyBindingConstants.TAB),
new KeyConversion("Space",KeyBindingConstants.SPACE),
new KeyConversion("Enter",KeyBindingConstants.ENTER),
new KeyConversion("*",KeyBindingConstants.KEYPAD_MULTIPLY),
new KeyConversion("/",KeyBindingConstants.KEYPAD_DIVIDE),
new KeyConversion(".",KeyBindingConstants.KEYPAD_DECIMAL),
};
private String key;
private int code;
private KeyConversion(String key,int code){
this.key = key;
this.code = code;
}
public String getKey(){
return this.key;
}
public int getCode(){
return this.code;
}
}