/* KeyboardMapping.java -- Maps X keysyms to Java keyCode and keyChar
   Copyright (C) 2006 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */

package gnu.java.awt.peer.x;

import gnu.x11.Input;
import gnu.x11.keysym.Latin1;
import gnu.x11.keysym.Misc;

import java.awt.event.KeyEvent;

/**
 * Defines the keyboard mapping from X keysyms to Java
 * keycodes and keychars.
 *
 * @author Roman Kennke (kennke@aicas.com)
 */
final class KeyboardMapping
{

  /**
   * Maps X keycodes to AWT keycodes.
   * 
   * @param xInput the X input event
   * @param xKeyCode the X keycode to map
   * @param xMods the X modifiers
   *
   * @return the AWT keycode and keychar
   */
  static int mapToKeyCode(gnu.x11.Input xInput, int xKeyCode, int xMods)
  {
    int mapped = KeyEvent.VK_UNDEFINED;
    int keysym = xInput.keycode_to_keysym(xKeyCode, xMods, true);

    // Special keys.
    if (keysym >= 255 << 8)
      {
        // FIXME: Add missing mappings.
        switch (keysym)
        {
          case Misc.BACKSPACE:
            mapped = KeyEvent.VK_BACK_SPACE;
            break;
          case Misc.TAB:
            mapped = KeyEvent.VK_TAB;
            break;
          case Misc.CLEAR:
            mapped = KeyEvent.VK_CLEAR;
            break;
          case Misc.RETURN:
            mapped = KeyEvent.VK_ENTER;
            break;
          case Misc.PAUSE:
            mapped = KeyEvent.VK_PAUSE;
            break;
          case Misc.SCROLL_LOCK:
            mapped = KeyEvent.VK_SCROLL_LOCK;
            break;
          case Misc.ESCAPE:
            mapped = KeyEvent.VK_ESCAPE;
            break;
          case Misc.HOME:
            mapped = KeyEvent.VK_HOME;
            break;
          case Misc.LEFT:
            mapped = KeyEvent.VK_LEFT;
            break;
          case Misc.UP:
            mapped = KeyEvent.VK_UP;
            break;
          case Misc.RIGHT:
            mapped = KeyEvent.VK_RIGHT;
            break;
          case Misc.DOWN:
            mapped = KeyEvent.VK_DOWN;
            break;
          case Misc.PAGE_UP:
            mapped = KeyEvent.VK_PAGE_UP;
            break;
          case Misc.PAGE_DOWN:
            mapped = KeyEvent.VK_PAGE_DOWN;
            break;
          case Misc.END:
            mapped = KeyEvent.VK_END;
            break;
          case Misc.BEGIN:
            mapped = KeyEvent.VK_BEGIN;
            break;
          case Misc.INSERT:
            mapped = KeyEvent.VK_INSERT;
            break;
          case Misc.UNDO:
            mapped = KeyEvent.VK_UNDO;
            break;
          case Misc.FIND:
            mapped = KeyEvent.VK_FIND;
            break;
          case Misc.CANCEL:
            mapped = KeyEvent.VK_CANCEL;
            break;
          case Misc.HELP:
            mapped = KeyEvent.VK_HELP;
            break;
          case Misc.MODE_SWITCH:
            mapped = KeyEvent.VK_MODECHANGE;
            break;
          case Misc.NUM_LOCK:
            mapped = KeyEvent.VK_NUM_LOCK;
            break;
          case Misc.KP_LEFT:
            mapped = KeyEvent.VK_KP_LEFT;
            break;
          case Misc.KP_UP:
            mapped = KeyEvent.VK_KP_UP;
            break;
          case Misc.KP_RIGHT:
            mapped = KeyEvent.VK_KP_RIGHT;
            break;
          case Misc.KP_DOWN:
            mapped = KeyEvent.VK_KP_DOWN;
            break;
          case Misc.F1:
            mapped = KeyEvent.VK_F1;
            break;
          case Misc.F2:
            mapped = KeyEvent.VK_F2;
            break;
          case Misc.F3:
            mapped = KeyEvent.VK_F3;
            break;
          case Misc.F4:
            mapped = KeyEvent.VK_F4;
            break;
          case Misc.F5:
            mapped = KeyEvent.VK_F5;
            break;
          case Misc.F6:
            mapped = KeyEvent.VK_F6;
            break;
          case Misc.F7:
            mapped = KeyEvent.VK_F7;
            break;
          case Misc.F8:
            mapped = KeyEvent.VK_F8;
            break;
          case Misc.F9:
            mapped = KeyEvent.VK_F9;
            break;
          case Misc.F10:
            mapped = KeyEvent.VK_F10;
            break;
          case Misc.F11:
            mapped = KeyEvent.VK_F11;
            break;
          case Misc.F12:
            mapped = KeyEvent.VK_F12;
            break;
          case Misc.F13:
            mapped = KeyEvent.VK_F13;
            break;
          case Misc.F14:
            mapped = KeyEvent.VK_F14;
            break;
          case Misc.F15:
            mapped = KeyEvent.VK_F15;
            break;
          case Misc.F16:
            mapped = KeyEvent.VK_F16;
            break;
          case Misc.F17:
            mapped = KeyEvent.VK_F17;
            break;
          case Misc.F18:
            mapped = KeyEvent.VK_F18;
            break;
          case Misc.F19:
            mapped = KeyEvent.VK_F19;
            break;
          case Misc.F20:
            mapped = KeyEvent.VK_F20;
            break;
          case Misc.F21:
            mapped = KeyEvent.VK_F21;
            break;
          case Misc.F22:
            mapped = KeyEvent.VK_F22;
            break;
          case Misc.F23:
            mapped = KeyEvent.VK_F23;
            break;
          case Misc.F24:
            mapped = KeyEvent.VK_F24;
            break;
          case Misc.SHIFT_L:
          case Misc.SHIFT_R:
            mapped = KeyEvent.VK_SHIFT;
            break;
          case Misc.CONTROL_L:
          case Misc.CONTROL_R:
            mapped = KeyEvent.VK_CONTROL;
            break;
          case Misc.CAPS_LOCK:
          case Misc.SHIFT_LOCK:
            mapped = KeyEvent.VK_CAPS_LOCK;
            break;
          case Misc.META_L:
          case Misc.META_R:
            mapped = KeyEvent.VK_META;
            break;
          case Misc.ALT_L:
          case Misc.ALT_R:
            mapped = KeyEvent.VK_ALT;
            break;
          case Misc.DELETE:
            mapped = KeyEvent.VK_DELETE;
            break;
          default:
            mapped = KeyEvent.VK_UNDEFINED;
        }
      }
    // Map Latin1 characters.
    else if (keysym < 256)
      {
        // TODO: Add missing mappings, if any.
        // Lowercase characters are mapped to
        // their corresponding upper case pendants.
        if (keysym >= Latin1.A_SMALL && keysym <= Latin1.Z_SMALL)
          mapped = keysym - 0x20;
        // Uppercase characters are mapped 1:1.
        else if (keysym >= Latin1.A && keysym <= Latin1.Z)
          mapped = keysym;
        // Digits are mapped 1:1.
        else if (keysym >= Latin1.NUM_0 && keysym <= Latin1.NUM_9)
          mapped = keysym;
        else
          {
            switch (keysym)
            {
              case Latin1.SPACE:
                mapped = KeyEvent.VK_SPACE;
                break;
              case Latin1.EXCLAM:
                mapped = KeyEvent.VK_EXCLAMATION_MARK;
                break;
              case Latin1.QUOTE_DBL:
                mapped = KeyEvent.VK_QUOTEDBL;
                break;
              case Latin1.NUMBER_SIGN:
                mapped = KeyEvent.VK_NUMBER_SIGN;
                break;
              case Latin1.DOLLAR:
                mapped = KeyEvent.VK_DOLLAR;
                break;
              case Latin1.AMPERSAND:
                mapped = KeyEvent.VK_AMPERSAND;
                break;
              case Latin1.APOSTROPHE:
                mapped = KeyEvent.VK_QUOTE;
                break;
              case Latin1.PAREN_LEFT:
                mapped = KeyEvent.VK_LEFT_PARENTHESIS;
                break;
              case Latin1.PAREN_RIGHT:
                mapped = KeyEvent.VK_RIGHT_PARENTHESIS;
                break;
              case Latin1.ASTERISK:
                mapped = KeyEvent.VK_ASTERISK;
                break;
              case Latin1.PLUS:
                mapped = KeyEvent.VK_PLUS;
                break;
              case Latin1.COMMA:
                mapped = KeyEvent.VK_COMMA;
                break;
              case Latin1.MINUS:
                mapped = KeyEvent.VK_MINUS;
                break;
              case Latin1.PERIOD:
                mapped = KeyEvent.VK_PERIOD;
                break;
              case Latin1.SLASH:
                mapped = KeyEvent.VK_SLASH;
                break;
              case Latin1.COLON:
                mapped = KeyEvent.VK_COLON;
                break;
              case Latin1.SEMICOLON:
                mapped = KeyEvent.VK_SEMICOLON;
                break;
              case Latin1.LESS:
                mapped = KeyEvent.VK_LESS;
                break;
              case Latin1.EQUAL:
                mapped = KeyEvent.VK_EQUALS;
                break;
              case Latin1.GREATER:
                mapped = KeyEvent.VK_GREATER;
                break;
              case Latin1.AT:
                mapped = KeyEvent.VK_AT;
                break;
              case Latin1.BRACKET_LEFT:
                mapped = KeyEvent.VK_OPEN_BRACKET;
                break;
              case Latin1.BACKSLASH:
                mapped = KeyEvent.VK_BACK_SLASH;
                break;
              case Latin1.BRACKET_RIGHT:
                mapped = KeyEvent.VK_CLOSE_BRACKET;
                break;
              case Latin1.ASCII_CIRCUM:
                mapped = KeyEvent.VK_CIRCUMFLEX;
                break;
              case Latin1.UNDERSCORE:
                mapped = KeyEvent.VK_UNDERSCORE;
                break;
              case Latin1.GRAVE:
                mapped = KeyEvent.VK_DEAD_GRAVE;
                break;
              case Latin1.BRACE_LEFT:
                mapped = KeyEvent.VK_BRACELEFT;
                break;
              case Latin1.BRACE_RIGHT:
                mapped = KeyEvent.VK_BRACERIGHT;
                break;
              case Latin1.ASCII_TILDE:
                mapped = KeyEvent.VK_DEAD_TILDE;
                break;
              case Latin1.EXCLAM_DOWN:
                mapped = KeyEvent.VK_INVERTED_EXCLAMATION_MARK;
                break;
              default:
                mapped = KeyEvent.VK_UNDEFINED;
            }
          }
      }
    return mapped;
  }

  /**
   * Maps X keycodes+modifiers to Java keychars.
   *
   * @param xInput The X Input to use for mapping
   * @param xKeyCode the X keycode
   * @param xMods the X key modifiers
   *
   * @return the Java keychar
   */
  static char mapToKeyChar(gnu.x11.Input xInput, int xKeyCode, int xMods)
  {
    char mapped = KeyEvent.CHAR_UNDEFINED;
    char keysym = (char) xInput.keycode_to_keysym(xKeyCode, xMods, false);
    // FIXME: Map other encodings properly.
    if (keysym < 256) // Latin1.
      {
        mapped = keysym;
      }
    return mapped;
  }

  /**
   * Maps X modifier masks to AWT modifier masks.
   *
   * @param xMods the X modifiers
   *
   * @return the AWT modifiers
   */
  static int mapModifiers(int xMods)
  {
    int mods = 0;

    if ((xMods & Input.SHIFT_MASK) != 0)
      mods |= KeyEvent.SHIFT_MASK | KeyEvent.SHIFT_DOWN_MASK;
    if ((xMods & Input.ALT_MASK) != 0)
      mods |= KeyEvent.ALT_MASK | KeyEvent.ALT_DOWN_MASK;
    if ((xMods & Input.CONTROL_MASK) != 0)
      mods |= KeyEvent.CTRL_MASK | KeyEvent.CTRL_DOWN_MASK;

    return mods;
  }
}
