/*******************************************************************************
 * Copyright (c) 2005 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jface.bindings.keys;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.jface.util.Util;
import org.eclipse.swt.SWT;

/**
 * <p>
 * A look-up table for the formal grammar for keys, and the integer values they
 * represent. This look-up table is hard-coded to use SWT representations. By
 * replacing this class (and
 * {@link org.eclipse.jface.bindings.keys.SWTKeySupport}), you can remove the
 * dependency on SWT.
 * </p>
 * 
 * @since 3.1
 * @see org.eclipse.jface.bindings.keys.KeyLookupFactory
 */
public final class SWTKeyLookup implements IKeyLookup {

	/**
	 * The look-up table for modifier keys. This is a map of formal name (<code>String</code>)
	 * to integer value (<code>Integer</code>).
	 */
	private final Map modifierKeyTable = new HashMap();

	/**
	 * The look-up table for formal names. This is a map of integer value (<code>Integer</code>)
	 * to formal name (<code>String</code>).
	 */
	private final Map nameTable = new HashMap();

	/**
	 * The look-up table for natural keys. This is a map of formal name (<code>String</code>)
	 * to integer value (<code>Integer</code>).
	 */
	private final Map naturalKeyTable = new HashMap();

	/**
	 * Constructs a new look-up class. This should only be done by the look-up
	 * factory.
	 * 
	 * @see KeyLookupFactory
	 */
	SWTKeyLookup() {
		final Integer alt = new Integer(SWT.ALT);
		final Integer command = new Integer(SWT.COMMAND);
		final Integer ctrl = new Integer(SWT.CTRL);
		final Integer shift = new Integer(SWT.SHIFT);
		modifierKeyTable.put(ALT_NAME, alt);
		nameTable.put(alt, ALT_NAME);
		modifierKeyTable.put(COMMAND_NAME, command);
		nameTable.put(command, COMMAND_NAME);
		modifierKeyTable.put(CTRL_NAME, ctrl);
		nameTable.put(ctrl, CTRL_NAME);
		modifierKeyTable.put(SHIFT_NAME, shift);
		nameTable.put(shift, SHIFT_NAME);
		modifierKeyTable.put(M1_NAME,
				"carbon".equals(SWT.getPlatform()) ? command : ctrl); //$NON-NLS-1$
		modifierKeyTable.put(M2_NAME, shift);
		modifierKeyTable.put(M3_NAME, alt);
		modifierKeyTable.put(M4_NAME, "carbon".equals(SWT.getPlatform()) ? ctrl //$NON-NLS-1$
				: command);

		final Integer arrowDown = new Integer(SWT.ARROW_DOWN);
		naturalKeyTable.put(ARROW_DOWN_NAME, arrowDown);
		nameTable.put(arrowDown, ARROW_DOWN_NAME);
		final Integer arrowLeft = new Integer(SWT.ARROW_LEFT);
		naturalKeyTable.put(ARROW_LEFT_NAME, arrowLeft);
		nameTable.put(arrowLeft, ARROW_LEFT_NAME);
		final Integer arrowRight = new Integer(SWT.ARROW_RIGHT);
		naturalKeyTable.put(ARROW_RIGHT_NAME, arrowRight);
		nameTable.put(arrowRight, ARROW_RIGHT_NAME);
		final Integer arrowUp = new Integer(SWT.ARROW_UP);
		naturalKeyTable.put(ARROW_UP_NAME, arrowUp);
		nameTable.put(arrowUp, ARROW_UP_NAME);
		final Integer breakKey = new Integer(SWT.BREAK);
		naturalKeyTable.put(BREAK_NAME, breakKey);
		nameTable.put(breakKey, BREAK_NAME);
		final Integer bs = new Integer(SWT.BS);
		naturalKeyTable.put(BS_NAME, bs);
		nameTable.put(bs, BS_NAME);
		naturalKeyTable.put(BACKSPACE_NAME, bs);
		final Integer capsLock = new Integer(SWT.CAPS_LOCK);
		naturalKeyTable.put(CAPS_LOCK_NAME, capsLock);
		nameTable.put(capsLock, CAPS_LOCK_NAME);
		final Integer cr = new Integer(SWT.CR);
		naturalKeyTable.put(CR_NAME, cr);
		nameTable.put(cr, CR_NAME);
		naturalKeyTable.put(ENTER_NAME, cr);
		naturalKeyTable.put(RETURN_NAME, cr);
		final Integer del = new Integer(SWT.DEL);
		naturalKeyTable.put(DEL_NAME, del);
		nameTable.put(del, DEL_NAME);
		naturalKeyTable.put(DELETE_NAME, del);
		final Integer end = new Integer(SWT.END);
		naturalKeyTable.put(END_NAME, end);
		nameTable.put(end, END_NAME);
		final Integer esc = new Integer(SWT.ESC);
		naturalKeyTable.put(ESC_NAME, esc);
		nameTable.put(esc, ESC_NAME);
		naturalKeyTable.put(ESCAPE_NAME, esc);
		final Integer f1 = new Integer(SWT.F1);
		naturalKeyTable.put(F1_NAME, f1);
		nameTable.put(f1, F1_NAME);
		final Integer f2 = new Integer(SWT.F2);
		naturalKeyTable.put(F2_NAME, new Integer(SWT.F2));
		nameTable.put(f2, F2_NAME);
		final Integer f3 = new Integer(SWT.F3);
		naturalKeyTable.put(F3_NAME, new Integer(SWT.F3));
		nameTable.put(f3, F3_NAME);
		final Integer f4 = new Integer(SWT.F4);
		naturalKeyTable.put(F4_NAME, new Integer(SWT.F4));
		nameTable.put(f4, F4_NAME);
		final Integer f5 = new Integer(SWT.F5);
		naturalKeyTable.put(F5_NAME, new Integer(SWT.F5));
		nameTable.put(f5, F5_NAME);
		final Integer f6 = new Integer(SWT.F6);
		naturalKeyTable.put(F6_NAME, new Integer(SWT.F6));
		nameTable.put(f6, F6_NAME);
		final Integer f7 = new Integer(SWT.F7);
		naturalKeyTable.put(F7_NAME, new Integer(SWT.F7));
		nameTable.put(f7, F7_NAME);
		final Integer f8 = new Integer(SWT.F8);
		naturalKeyTable.put(F8_NAME, new Integer(SWT.F8));
		nameTable.put(f8, F8_NAME);
		final Integer f9 = new Integer(SWT.F9);
		naturalKeyTable.put(F9_NAME, new Integer(SWT.F9));
		nameTable.put(f9, F9_NAME);
		final Integer f10 = new Integer(SWT.F10);
		naturalKeyTable.put(F10_NAME, new Integer(SWT.F10));
		nameTable.put(f10, F10_NAME);
		final Integer f11 = new Integer(SWT.F11);
		naturalKeyTable.put(F11_NAME, new Integer(SWT.F11));
		nameTable.put(f11, F11_NAME);
		final Integer f12 = new Integer(SWT.F12);
		naturalKeyTable.put(F12_NAME, new Integer(SWT.F12));
		nameTable.put(f12, F12_NAME);
		final Integer f13 = new Integer(SWT.F13);
		naturalKeyTable.put(F13_NAME, new Integer(SWT.F13));
		nameTable.put(f13, F13_NAME);
		final Integer f14 = new Integer(SWT.F14);
		naturalKeyTable.put(F14_NAME, new Integer(SWT.F14));
		nameTable.put(f14, F14_NAME);
		final Integer f15 = new Integer(SWT.F15);
		naturalKeyTable.put(F15_NAME, new Integer(SWT.F15));
		nameTable.put(f15, F15_NAME);
		final Integer ff = new Integer(12); // ASCII 0x0C
		naturalKeyTable.put(FF_NAME, ff);
		nameTable.put(ff, FF_NAME);
		final Integer home = new Integer(SWT.HOME);
		naturalKeyTable.put(HOME_NAME, home);
		nameTable.put(home, HOME_NAME);
		final Integer insert = new Integer(SWT.INSERT);
		naturalKeyTable.put(INSERT_NAME, insert);
		nameTable.put(insert, INSERT_NAME);
		final Integer lf = new Integer(SWT.LF);
		naturalKeyTable.put(LF_NAME, lf);
		nameTable.put(lf, LF_NAME);
		final Integer nul = new Integer(SWT.NULL);
		naturalKeyTable.put(NUL_NAME, nul);
		nameTable.put(nul, NUL_NAME);
		final Integer numLock = new Integer(SWT.NUM_LOCK);
		naturalKeyTable.put(NUM_LOCK_NAME, numLock);
		nameTable.put(numLock, NUM_LOCK_NAME);
		final Integer keypad0 = new Integer(SWT.KEYPAD_0);
		naturalKeyTable.put(NUMPAD_0_NAME, keypad0);
		nameTable.put(keypad0, NUMPAD_0_NAME);
		final Integer keypad1 = new Integer(SWT.KEYPAD_1);
		naturalKeyTable.put(NUMPAD_1_NAME, keypad1);
		nameTable.put(keypad1, NUMPAD_1_NAME);
		final Integer keypad2 = new Integer(SWT.KEYPAD_2);
		naturalKeyTable.put(NUMPAD_2_NAME, keypad2);
		nameTable.put(keypad2, NUMPAD_2_NAME);
		final Integer keypad3 = new Integer(SWT.KEYPAD_3);
		naturalKeyTable.put(NUMPAD_3_NAME, keypad3);
		nameTable.put(keypad3, NUMPAD_3_NAME);
		final Integer keypad4 = new Integer(SWT.KEYPAD_4);
		naturalKeyTable.put(NUMPAD_4_NAME, keypad4);
		nameTable.put(keypad4, NUMPAD_4_NAME);
		final Integer keypad5 = new Integer(SWT.KEYPAD_5);
		naturalKeyTable.put(NUMPAD_5_NAME, keypad5);
		nameTable.put(keypad5, NUMPAD_5_NAME);
		final Integer keypad6 = new Integer(SWT.KEYPAD_6);
		naturalKeyTable.put(NUMPAD_6_NAME, keypad6);
		nameTable.put(keypad6, NUMPAD_6_NAME);
		final Integer keypad7 = new Integer(SWT.KEYPAD_7);
		naturalKeyTable.put(NUMPAD_7_NAME, keypad7);
		nameTable.put(keypad7, NUMPAD_7_NAME);
		final Integer keypad8 = new Integer(SWT.KEYPAD_8);
		naturalKeyTable.put(NUMPAD_8_NAME, keypad8);
		nameTable.put(keypad8, NUMPAD_8_NAME);
		final Integer keypad9 = new Integer(SWT.KEYPAD_9);
		naturalKeyTable.put(NUMPAD_9_NAME, keypad9);
		nameTable.put(keypad9, NUMPAD_9_NAME);
		final Integer keypadAdd = new Integer(SWT.KEYPAD_ADD);
		naturalKeyTable.put(NUMPAD_ADD_NAME, keypadAdd);
		nameTable.put(keypadAdd, NUMPAD_ADD_NAME);
		final Integer keypadDecimal = new Integer(SWT.KEYPAD_DECIMAL);
		naturalKeyTable.put(NUMPAD_DECIMAL_NAME, keypadDecimal);
		nameTable.put(keypadDecimal, NUMPAD_DECIMAL_NAME);
		final Integer keypadDivide = new Integer(SWT.KEYPAD_DIVIDE);
		naturalKeyTable.put(NUMPAD_DIVIDE_NAME, keypadDivide);
		nameTable.put(keypadDivide, NUMPAD_DIVIDE_NAME);
		final Integer keypadCr = new Integer(SWT.KEYPAD_CR);
		naturalKeyTable.put(NUMPAD_ENTER_NAME, keypadCr);
		nameTable.put(keypadCr, NUMPAD_ENTER_NAME);
		final Integer keypadEqual = new Integer(SWT.KEYPAD_EQUAL);
		naturalKeyTable.put(NUMPAD_EQUAL_NAME, keypadEqual);
		nameTable.put(keypadEqual, NUMPAD_EQUAL_NAME);
		final Integer keypadMultiply = new Integer(SWT.KEYPAD_MULTIPLY);
		naturalKeyTable.put(NUMPAD_MULTIPLY_NAME, keypadMultiply);
		nameTable.put(keypadMultiply, NUMPAD_MULTIPLY_NAME);
		final Integer keypadSubtract = new Integer(SWT.KEYPAD_SUBTRACT);
		naturalKeyTable.put(NUMPAD_SUBTRACT_NAME, keypadSubtract);
		nameTable.put(keypadSubtract, NUMPAD_SUBTRACT_NAME);
		final Integer pageDown = new Integer(SWT.PAGE_DOWN);
		naturalKeyTable.put(PAGE_DOWN_NAME, pageDown);
		nameTable.put(pageDown, PAGE_DOWN_NAME);
		final Integer pageUp = new Integer(SWT.PAGE_UP);
		naturalKeyTable.put(PAGE_UP_NAME, pageUp);
		nameTable.put(pageUp, PAGE_UP_NAME);
		final Integer pause = new Integer(SWT.PAUSE);
		naturalKeyTable.put(PAUSE_NAME, pause);
		nameTable.put(pause, PAUSE_NAME);
		final Integer printScreen = new Integer(SWT.PRINT_SCREEN);
		naturalKeyTable.put(PRINT_SCREEN_NAME, printScreen);
		nameTable.put(printScreen, PRINT_SCREEN_NAME);
		final Integer scrollLock = new Integer(SWT.SCROLL_LOCK);
		naturalKeyTable.put(SCROLL_LOCK_NAME, scrollLock);
		nameTable.put(scrollLock, SCROLL_LOCK_NAME);
		final Integer space = new Integer(' ');
		naturalKeyTable.put(SPACE_NAME, space);
		nameTable.put(space, SPACE_NAME);
		final Integer tab = new Integer(SWT.TAB);
		naturalKeyTable.put(TAB_NAME, tab);
		nameTable.put(tab, TAB_NAME);
		final Integer vt = new Integer(11); // ASCII 0x0B
		naturalKeyTable.put(VT_NAME, vt);
		nameTable.put(vt, VT_NAME);
	}

	/*
     * (non-Javadoc)
     * 
 	 * @see org.eclipse.jface.bindings.keys.IKeyLookup#formalKeyLookup(java.lang.String)
 	 * 
	 */	
	public final int formalKeyLookup(final String name) {
		final Object value = naturalKeyTable.get(name);
		if (value instanceof Integer) {
			return ((Integer) value).intValue();
		}
		
		if (name.length() > 0) {
			throw new IllegalArgumentException("Unrecognized formal key name: " //$NON-NLS-1$
					+ name);
		}

		return name.charAt(0);
	}

	/*
     * (non-Javadoc)
     * 
 	 * @see org.eclipse.jface.bindings.keys.IKeyLookup#formalKeyLookupInteger(java.lang.String)
 	 * 
	 */	
	public final Integer formalKeyLookupInteger(final String name) {
		final Object value = naturalKeyTable.get(name);
		if (value instanceof Integer) {
			return (Integer) value;
		}

		return new Integer(name.charAt(0));
	}

	/*
     * (non-Javadoc)
     * 
 	 * @see org.eclipse.jface.bindings.keys.IKeyLookup#formalModifierLookup(java.lang.String)
 	 * 
	 */	
	public final int formalModifierLookup(final String name) {
		final Object value = modifierKeyTable.get(name);
		if (value instanceof Integer) {
			return ((Integer) value).intValue();
		}

		return 0;
	}

	/*
     * (non-Javadoc)
     * 
 	 * @see org.eclipse.jface.bindings.keys.IKeyLookup#formalNameLookup(int)
 	 * 
	 */	
	public final String formalNameLookup(final int key) {
		final Integer keyObject = new Integer(key);
		final Object value = nameTable.get(keyObject);
		if (value instanceof String) {
			return (String) value;
		}

		return Util.ZERO_LENGTH_STRING + ((char) key);
	}

	/*
     * (non-Javadoc)
     * 
 	 * @see org.eclipse.jface.bindings.keys.IKeyLookup#getAlt()
 	 * 
	 */	
	public final int getAlt() {
		return SWT.ALT;
	}

	/*
     * (non-Javadoc)
     * 
 	 * @see org.eclipse.jface.bindings.keys.IKeyLookup#getCommand()
 	 * 
	 */	
	public final int getCommand() {
		return SWT.COMMAND;
	}

	/*
     * (non-Javadoc)
     * 
 	 * @see org.eclipse.jface.bindings.keys.IKeyLookup#getCtrl()
 	 * 
	 */	
	public final int getCtrl() {
		return SWT.CTRL;
	}

	/*
     * (non-Javadoc)
     * 
 	 * @see org.eclipse.jface.bindings.keys.IKeyLookup#getShift()
 	 * 
	 */	
	public final int getShift() {
		return SWT.SHIFT;
	}

	/*
     * (non-Javadoc)
     * 
 	 * @see org.eclipse.jface.bindings.keys.IKeyLookup#isModifierKey(int)
 	 * 
	 */	
	public final boolean isModifierKey(final int key) {
		return ((key & SWT.MODIFIER_MASK) != 0);
	}
}
