/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation and Others
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Daisuke SATO - initial API and implementation
 *******************************************************************************/
package org.eclipse.actf.ai.screenreader.jaws.script;

import java.awt.event.KeyEvent;
import java.lang.reflect.Field;

import org.w3c.dom.Element;
import org.w3c.dom.Node;

public class Key {
    public int key;

    public int modifier;

    public Key jawsKey;

    public boolean jawsHandle = false;

    public boolean jawsSayAllStop = true;

    public boolean jawsSayAllStopIgnore = false;
    
    public boolean currentScript = false;
    
    public boolean jawsScript = true;

    public Key(Node keyNode, Element commandElement) {
        this(keyNode.getTextContent().trim());
        
        if (keyNode instanceof Element) {
            Element keyElem = (Element) keyNode;
            String key = keyElem.getAttribute("jawskey");
            if ((key != null) && (key.length() > 0)) {
                jawsKey = new Key(key);
            }
            String jawsHandleVal = keyElem.getAttribute("jawshandle");
            if (jawsHandleVal != null) {
                if (jawsHandleVal.trim().equals("true")) {
                    jawsHandle = true;
                }
            }
            String jawsSayAllStopVal = keyElem.getAttribute("jawsSayAllStop");
            if (jawsSayAllStopVal != null) {
                if (jawsSayAllStopVal.trim().equals("false")) {
                    jawsSayAllStop = false;
                }
            }
            String jawsScriptVal = keyElem.getAttribute("jawsscript");
            if (jawsScriptVal != null) {
                if (jawsScriptVal.trim().equals("false")) {
                    jawsScript = false;
                }
            }
            if ("speakAll".equals(commandElement.getTagName())) {
                jawsSayAllStopIgnore = true;
            }
        }
    }

    public Key(String keyStr) {
        init(keyStr);
    }

    private void init(String keyStr) {
        String keyStrs[] = keyStr.split("[ \t\r\n]");

        if ("currentScript".equals(keyStr)){
            currentScript = true;
            return;
        }
        
        modifier = 0;
        for (int i = 0; i < keyStrs.length; i++) {
            if (keyStrs[i].startsWith("VK_")) {
                key = convertToInt(keyStrs[i]);
            } else if (keyStrs[i].endsWith("_MASK")) {
                modifier |= convertToInt(keyStrs[i]);
            }
        }
        if(key == 0){
            System.err.println("ERROR init "+keyStr);
        }
    }

    @Override
    public String toString() {
        return KeyConverter.convert(key, modifier);
    }

    public String toTypeString() {
        if (key == KeyEvent.VK_PAUSE)
            return "Control+Alt+Shift+P";
        return toString();
    }

    private int convertToInt(String code) {
        code = code.trim();
        try {
            int i = Integer.parseInt(code);
            return i;
        } catch (java.lang.NumberFormatException e) {
            //e.printStackTrace();
        }

        if (code.equals("VK_RETURN")) {
            return 13;
        }

        try {
            Class<java.awt.event.KeyEvent> c = java.awt.event.KeyEvent.class;
            Field f = c.getField(code);
            return ((Integer) f.get(null)).intValue();
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.err.println("ERROR "+code);
        return 0;
    }

    public String toFuncString() {
        String temp = toString();
        temp = temp.replaceAll("\\+", "_");
        return "func_" + temp;
    }
}
